Merge pull request #1636 from MLD5000/create-packer-stream

Create packer stream "toStream"
This commit is contained in:
Dolan
2022-09-15 13:04:15 +01:00
committed by GitHub
4 changed files with 95 additions and 0 deletions

31
demo/74-nodejs-stream.ts Normal file
View File

@ -0,0 +1,31 @@
// Simple example to add text to a document
// Import from 'docx' rather than '../build' if you install from npm
import * as fs from "fs";
import { Document, Packer, Paragraph, TextRun } from "../build";
const doc = new Document({
sections: [
{
properties: {},
children: [
new Paragraph({
children: [
new TextRun("Hello World"),
new TextRun({
text: "Foo Bar",
bold: true,
}),
new TextRun({
text: "\tGithub is the best",
bold: true,
}),
],
}),
],
},
],
});
Packer.toStream(doc).then((stream) => {
stream.pipe(fs.createWriteStream("My Document.docx"));
});

View File

@ -122,4 +122,52 @@ describe("Packer", () => {
(Packer as any).compiler.compile.restore(); (Packer as any).compiler.compile.restore();
}); });
}); });
describe("#toStream()", () => {
it("should create a standard docx file", async () => {
// tslint:disable-next-line: no-any
stub((Packer as any).compiler, "compile").callsFake(() => ({
// tslint:disable-next-line: no-empty
generateNodeStream: () => ({
on: (event: string, cb: () => void) => {
if (event === "end") {
cb();
}
},
}),
}));
const stream = await Packer.toStream(file);
return new Promise((resolve, reject) => {
stream.on("error", () => {
reject();
});
stream.on("end", () => {
resolve();
});
});
});
it("should handle exception if it throws any", async () => {
// tslint:disable-next-line:no-any
const compiler = stub((Packer as any).compiler, "compile").callsFake(() => ({
// tslint:disable-next-line: no-empty
on: (event: string, cb: () => void) => {
if (event === "error") {
cb();
}
},
}));
compiler.throwsException();
return Packer.toStream(file).catch((error) => {
assert.isDefined(error);
});
});
afterEach(() => {
// tslint:disable-next-line:no-any
(Packer as any).compiler.compile.restore();
});
});
}); });

View File

@ -1,4 +1,5 @@
import { File } from "@file/file"; import { File } from "@file/file";
import { Stream } from "stream";
import { Compiler } from "./next-compiler"; import { Compiler } from "./next-compiler";
@ -57,5 +58,17 @@ export class Packer {
return zipData; return zipData;
} }
public static async toStream(file: File, prettify?: boolean | PrettifyType): Promise<Stream> {
const zip = this.compiler.compile(file, prettify);
const zipData = zip.generateNodeStream({
type: "nodebuffer",
streamFiles: true,
mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
compression: "DEFLATE",
});
return zipData;
}
private static readonly compiler = new Compiler(); private static readonly compiler = new Compiler();
} }

View File

@ -23,6 +23,9 @@ const configuration = {
stream: require.resolve("stream-browserify"), stream: require.resolve("stream-browserify"),
}, },
plugins: [new TsconfigPathsPlugin()], plugins: [new TsconfigPathsPlugin()],
alias: {
jszip: require.resolve('jszip/lib/index.js'),
},
}, },
module: { module: {