Merge pull request #1636 from MLD5000/create-packer-stream
Create packer stream "toStream"
This commit is contained in:
31
demo/74-nodejs-stream.ts
Normal file
31
demo/74-nodejs-stream.ts
Normal 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"));
|
||||
});
|
@ -122,4 +122,52 @@ describe("Packer", () => {
|
||||
(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();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -1,4 +1,5 @@
|
||||
import { File } from "@file/file";
|
||||
import { Stream } from "stream";
|
||||
|
||||
import { Compiler } from "./next-compiler";
|
||||
|
||||
@ -57,5 +58,17 @@ export class Packer {
|
||||
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();
|
||||
}
|
||||
|
@ -23,6 +23,9 @@ const configuration = {
|
||||
stream: require.resolve("stream-browserify"),
|
||||
},
|
||||
plugins: [new TsconfigPathsPlugin()],
|
||||
alias: {
|
||||
jszip: require.resolve('jszip/lib/index.js'),
|
||||
},
|
||||
},
|
||||
|
||||
module: {
|
||||
|
Reference in New Issue
Block a user