diff --git a/demo/browser-demo.html b/demo/browser-demo.html
new file mode 100644
index 0000000000..17508b74eb
--- /dev/null
+++ b/demo/browser-demo.html
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+ DOCX browser Word document generation
+
+
+
+
+
+
+
+
diff --git a/package.json b/package.json
index 99104a157d..cc5394462b 100644
--- a/package.json
+++ b/package.json
@@ -12,6 +12,7 @@
"build": "npm run webpack && npm run fix-types",
"tsc": "rimraf ./build && tsc -p .",
"webpack": "rimraf ./build && webpack",
+ "build.web": "webpack --config webpack.web.config.js",
"demo": "npm run build && node ./demo",
"typedoc": "typedoc --out docs/ src/ --module commonjs --target ES6 --disableOutputCheck --excludePrivate --externalPattern \"**/*.spec.ts\"",
"style": "prettier -l \"src/**/*.ts\"",
diff --git a/src/export/packer/browser.ts b/src/export/packer/browser.ts
new file mode 100644
index 0000000000..ad88a5552c
--- /dev/null
+++ b/src/export/packer/browser.ts
@@ -0,0 +1,17 @@
+import { Compiler } from "./next-compiler";
+import { IPacker } from "./packer";
+
+declare var saveAs;
+
+export class BrowserPacker implements IPacker {
+ private readonly packer: Compiler;
+
+ public async pack(filePath: string): Promise {
+ filePath = filePath.replace(/.docx$/, "");
+
+ const zip = await this.packer.compile();
+ const zipBlob = await zip.generateAsync({ type: "blob" });
+
+ saveAs(zipBlob, `${filePath}.docx`);
+ }
+}
diff --git a/src/export/packer/compiler.ts b/src/export/packer/compiler.ts
index 44c7817249..410ecc669b 100644
--- a/src/export/packer/compiler.ts
+++ b/src/export/packer/compiler.ts
@@ -1,5 +1,6 @@
import * as archiver from "archiver";
import * as express from "express";
+import * as fs from "fs";
import { Writable } from "stream";
import * as xml from "xml";
@@ -89,7 +90,7 @@ export class Compiler {
});
for (const data of this.file.Media.array) {
- this.archive.append(data.stream, {
+ this.archive.append(fs.createReadStream(data.path), {
name: `word/media/${data.fileName}`,
});
}
diff --git a/src/file/drawing/drawing.spec.ts b/src/file/drawing/drawing.spec.ts
index 9b113da0bf..6ca09faa4d 100644
--- a/src/file/drawing/drawing.spec.ts
+++ b/src/file/drawing/drawing.spec.ts
@@ -12,7 +12,6 @@ describe("Drawing", () => {
currentBreak = new Drawing({
fileName: "test.jpg",
referenceId: 1,
- stream: fs.createReadStream(path),
path: path,
dimensions: {
pixels: {
diff --git a/src/file/media/data.ts b/src/file/media/data.ts
index 00836ed962..b4a349a967 100644
--- a/src/file/media/data.ts
+++ b/src/file/media/data.ts
@@ -1,5 +1,3 @@
-import * as fs from "fs";
-
export interface IMediaDataDimensions {
pixels: {
x: number;
@@ -13,7 +11,6 @@ export interface IMediaDataDimensions {
export interface IMediaData {
referenceId: number;
- stream: fs.ReadStream;
path: string;
fileName: string;
dimensions: IMediaDataDimensions;
diff --git a/src/file/media/media.ts b/src/file/media/media.ts
index 5ac8905bc7..3f23e50b38 100644
--- a/src/file/media/media.ts
+++ b/src/file/media/media.ts
@@ -1,4 +1,3 @@
-import * as fs from "fs";
import * as sizeOf from "image-size";
import * as path from "path";
@@ -27,7 +26,6 @@ export class Media {
const imageData = {
referenceId: this.map.size + relationshipsCount + 1,
- stream: fs.createReadStream(filePath),
path: filePath,
fileName: key,
dimensions: {
diff --git a/webpack.web.config.js b/webpack.web.config.js
new file mode 100644
index 0000000000..9672df789c
--- /dev/null
+++ b/webpack.web.config.js
@@ -0,0 +1,32 @@
+const path = require('path');
+
+module.exports = {
+ entry: './src/index.ts',
+
+ output: {
+ path: path.resolve('build'),
+ filename: 'index.web.js',
+ libraryTarget: 'umd'
+ },
+
+ resolve: {
+ extensions: ['.tsx', '.ts', '.js'],
+ modules: [path.resolve('./src'), "node_modules"]
+ },
+
+ module: {
+ rules: [
+ {
+ test: /\.ts$/,
+ loaders: ["awesome-typescript-loader"],
+ }
+ ],
+ },
+
+ node: {
+ __dirname: true,
+ fs: "empty",
+ tls: "empty",
+ net: "empty"
+ }
+};