chromiumly 1.0.4 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/README.md +62 -18
  2. package/dist/chromium/converters/converter.d.ts +5 -0
  3. package/dist/chromium/converters/converter.js +11 -0
  4. package/dist/chromium/converters/converter.js.map +1 -0
  5. package/dist/chromium/converters/html.converter.d.ts +14 -0
  6. package/dist/chromium/converters/html.converter.js +36 -0
  7. package/dist/chromium/converters/html.converter.js.map +1 -0
  8. package/dist/chromium/converters/markdown.converter.d.ts +15 -0
  9. package/dist/chromium/converters/markdown.converter.js +38 -0
  10. package/dist/chromium/converters/markdown.converter.js.map +1 -0
  11. package/dist/chromium/converters/url.converter.d.ts +13 -0
  12. package/dist/{converters → chromium/converters}/url.converter.js +10 -6
  13. package/dist/chromium/converters/url.converter.js.map +1 -0
  14. package/dist/chromium/index.d.ts +3 -0
  15. package/dist/chromium/index.js +10 -0
  16. package/dist/chromium/index.js.map +1 -0
  17. package/dist/{common → chromium/interfaces}/converter.interface.d.ts +2 -1
  18. package/dist/{common → chromium/interfaces}/converter.interface.js +0 -0
  19. package/dist/chromium/interfaces/converter.interface.js.map +1 -0
  20. package/dist/{common → chromium/interfaces}/converter.types.d.ts +0 -0
  21. package/dist/{common → chromium/interfaces}/converter.types.js +0 -0
  22. package/dist/chromium/interfaces/converter.types.js.map +1 -0
  23. package/dist/chromium/utils/converter.utils.d.ts +5 -0
  24. package/dist/chromium/utils/converter.utils.js +45 -0
  25. package/dist/chromium/utils/converter.utils.js.map +1 -0
  26. package/dist/common/constants.d.ts +5 -0
  27. package/dist/common/constants.js +10 -0
  28. package/dist/common/constants.js.map +1 -0
  29. package/dist/common/gotenberg.utils.d.ts +6 -0
  30. package/dist/common/gotenberg.utils.js +27 -0
  31. package/dist/common/gotenberg.utils.js.map +1 -0
  32. package/dist/common/index.d.ts +2 -0
  33. package/dist/common/index.js +8 -0
  34. package/dist/common/index.js.map +1 -0
  35. package/dist/libre-office/index.d.ts +2 -0
  36. package/dist/libre-office/index.js +6 -0
  37. package/dist/libre-office/index.js.map +1 -0
  38. package/dist/libre-office/interfaces/libre-office.types.d.ts +7 -0
  39. package/dist/libre-office/interfaces/libre-office.types.js +3 -0
  40. package/dist/libre-office/interfaces/libre-office.types.js.map +1 -0
  41. package/dist/libre-office/utils/constants.d.ts +1 -0
  42. package/dist/libre-office/utils/constants.js +82 -0
  43. package/dist/libre-office/utils/constants.js.map +1 -0
  44. package/dist/libre-office/utils/libre-office.utils.d.ts +8 -0
  45. package/dist/libre-office/utils/libre-office.utils.js +44 -0
  46. package/dist/libre-office/utils/libre-office.utils.js.map +1 -0
  47. package/dist/main.config.d.ts +22 -10
  48. package/dist/main.config.js +28 -15
  49. package/dist/main.config.js.map +1 -1
  50. package/dist/main.d.ts +3 -3
  51. package/dist/main.js +9 -7
  52. package/dist/main.js.map +1 -1
  53. package/dist/pdf-engines/index.d.ts +1 -0
  54. package/dist/pdf-engines/index.js +6 -0
  55. package/dist/pdf-engines/index.js.map +1 -0
  56. package/dist/pdf-engines/pdf.engine.d.ts +16 -0
  57. package/dist/pdf-engines/pdf.engine.js +47 -0
  58. package/dist/pdf-engines/pdf.engine.js.map +1 -0
  59. package/dist/pdf-engines/utils/engine.utils.d.ts +6 -0
  60. package/dist/pdf-engines/utils/engine.utils.js +30 -0
  61. package/dist/pdf-engines/utils/engine.utils.js.map +1 -0
  62. package/package.json +10 -3
  63. package/src/chromium/converters/converter.ts +9 -0
  64. package/src/chromium/converters/html.converter.ts +41 -0
  65. package/src/chromium/converters/markdown.converter.ts +45 -0
  66. package/src/chromium/converters/tests/html.converter.test.ts +95 -0
  67. package/src/chromium/converters/tests/markdown.converter.test.ts +105 -0
  68. package/src/chromium/converters/tests/url.converter.test.ts +82 -0
  69. package/src/{converters → chromium/converters}/url.converter.ts +13 -7
  70. package/src/chromium/index.ts +3 -0
  71. package/src/{common → chromium/interfaces}/converter.interface.ts +2 -1
  72. package/src/{common → chromium/interfaces}/converter.types.ts +0 -0
  73. package/src/chromium/utils/converter.utils.ts +75 -0
  74. package/src/chromium/utils/tests/converter.utils.test.ts +101 -0
  75. package/src/common/constants.ts +5 -0
  76. package/src/common/gotenberg.utils.ts +25 -0
  77. package/src/common/index.ts +2 -0
  78. package/src/common/tests/gotenberg.utils.test.ts +71 -0
  79. package/src/libre-office/index.ts +2 -0
  80. package/src/libre-office/interfaces/libre-office.types.ts +4 -0
  81. package/src/libre-office/utils/constants.ts +78 -0
  82. package/src/libre-office/utils/libre-office.utils.ts +51 -0
  83. package/src/libre-office/utils/test/libre-office.utils.test.ts +85 -0
  84. package/src/main.config.ts +23 -10
  85. package/src/main.ts +3 -3
  86. package/src/pdf-engines/index.ts +1 -0
  87. package/src/pdf-engines/pdf.engine.ts +53 -0
  88. package/src/pdf-engines/tests/pdf.engine.test.ts +84 -0
  89. package/src/pdf-engines/utils/engine.utils.ts +23 -0
  90. package/src/pdf-engines/utils/tests/engine.utils.test.ts +59 -0
  91. package/dist/common/converter.d.ts +0 -7
  92. package/dist/common/converter.interface.js.map +0 -1
  93. package/dist/common/converter.js +0 -21
  94. package/dist/common/converter.js.map +0 -1
  95. package/dist/common/converter.types.js.map +0 -1
  96. package/dist/common/converter.utils.d.ts +0 -8
  97. package/dist/common/converter.utils.js +0 -66
  98. package/dist/common/converter.utils.js.map +0 -1
  99. package/dist/converters/html.converter.d.ts +0 -12
  100. package/dist/converters/html.converter.js +0 -26
  101. package/dist/converters/html.converter.js.map +0 -1
  102. package/dist/converters/markdown.converter.d.ts +0 -13
  103. package/dist/converters/markdown.converter.js +0 -27
  104. package/dist/converters/markdown.converter.js.map +0 -1
  105. package/dist/converters/url.converter.d.ts +0 -11
  106. package/dist/converters/url.converter.js.map +0 -1
  107. package/src/common/converter.ts +0 -18
  108. package/src/common/converter.utils.ts +0 -101
  109. package/src/converters/html.converter.ts +0 -30
  110. package/src/converters/markdown.converter.ts +0 -33
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LibreOfficeUtils = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const fs_1 = require("fs");
6
+ const path_1 = tslib_1.__importDefault(require("path"));
7
+ const common_1 = require("../../common");
8
+ const constants_1 = require("./constants");
9
+ class LibreOfficeUtils {
10
+ static injectFiles(files, data) {
11
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
12
+ for (const file of files) {
13
+ try {
14
+ yield fs_1.promises.access(file, fs_1.constants.R_OK);
15
+ const filename = path_1.default.basename(file.toString());
16
+ const extension = path_1.default.extname(filename);
17
+ if (constants_1.LIBRE_OFFICE_EXTENSIONS.includes(extension)) {
18
+ data.append(filename, (0, fs_1.createReadStream)(file));
19
+ }
20
+ else {
21
+ throw new Error(`${extension} is not supported`);
22
+ }
23
+ }
24
+ catch (error) {
25
+ throw error;
26
+ }
27
+ }
28
+ });
29
+ }
30
+ static injectPageProperties(data, pageProperties) {
31
+ if (pageProperties.landscape) {
32
+ data.append("landscape", String(pageProperties.landscape));
33
+ }
34
+ if (pageProperties.nativePageRanges) {
35
+ common_1.GotenbergUtils.assert(pageProperties.nativePageRanges.from > 0 &&
36
+ pageProperties.nativePageRanges.to > 0 &&
37
+ pageProperties.nativePageRanges.to >=
38
+ pageProperties.nativePageRanges.from, "page ranges syntax error");
39
+ data.append("nativePageRanges", `${pageProperties.nativePageRanges.from}-${pageProperties.nativePageRanges.to}`);
40
+ }
41
+ }
42
+ }
43
+ exports.LibreOfficeUtils = LibreOfficeUtils;
44
+ //# sourceMappingURL=libre-office.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"libre-office.utils.js","sourceRoot":"","sources":["../../../src/libre-office/utils/libre-office.utils.ts"],"names":[],"mappings":";;;;AAAA,2BAAqE;AACrE,wDAAwB;AAIxB,yCAA8C;AAC9C,2CAAsD;AAGtD,MAAa,gBAAgB;IACpB,MAAM,CAAO,WAAW,CAAC,KAAiB,EAAE,IAAc;;YAC/D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACxB,IAAI;oBACF,MAAM,aAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,cAAS,CAAC,IAAI,CAAC,CAAC;oBAC5C,MAAM,QAAQ,GAAG,cAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAChD,MAAM,SAAS,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBACzC,IAAI,mCAAuB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;wBAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAA,qBAAgB,EAAC,IAAI,CAAC,CAAC,CAAC;qBAC/C;yBAAM;wBACL,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,mBAAmB,CAAC,CAAC;qBAClD;iBACF;gBAAC,OAAO,KAAK,EAAE;oBACd,MAAM,KAAK,CAAC;iBACb;aACF;QACH,CAAC;KAAA;IAEM,MAAM,CAAC,oBAAoB,CAChC,IAAc,EACd,cAA8B;QAE9B,IAAI,cAAc,CAAC,SAAS,EAAE;YAC5B,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;SAC5D;QAED,IAAI,cAAc,CAAC,gBAAgB,EAAE;YACnC,uBAAc,CAAC,MAAM,CACnB,cAAc,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC;gBACtC,cAAc,CAAC,gBAAgB,CAAC,EAAE,GAAG,CAAC;gBACtC,cAAc,CAAC,gBAAgB,CAAC,EAAE;oBAChC,cAAc,CAAC,gBAAgB,CAAC,IAAI,EACxC,0BAA0B,CAC3B,CAAC;YAEF,IAAI,CAAC,MAAM,CACT,kBAAkB,EAClB,GAAG,cAAc,CAAC,gBAAgB,CAAC,IAAI,IAAI,cAAc,CAAC,gBAAgB,CAAC,EAAE,EAAE,CAChF,CAAC;SACH;IACH,CAAC;CACF;AAzCD,4CAyCC"}
@@ -1,17 +1,29 @@
1
- export declare enum Route {
1
+ export declare enum ChromiumRoute {
2
2
  URL = "url",
3
3
  HTML = "html",
4
4
  MARKDOWN = "markdown"
5
5
  }
6
+ declare enum PdfEngineRoute {
7
+ MERGE = "merge"
8
+ }
9
+ declare enum LibreOfficeRoute {
10
+ CONVERT = "convert"
11
+ }
6
12
  export declare class Chromiumly {
7
- private static readonly GOTENBERG_ENDPOINT;
8
- private static readonly PATH;
9
- private static readonly ROUTES;
10
- static readonly endpoint: string;
11
- static readonly path = "forms/chromium/convert";
12
- static readonly routes: {
13
- url: Route;
14
- html: Route;
15
- markdown: Route;
13
+ static readonly GOTENBERG_ENDPOINT: string;
14
+ static readonly CHROMIUM_PATH = "forms/chromium/convert";
15
+ static readonly PDF_ENGINES_PATH = "forms/pdfengines";
16
+ static readonly LIBRE_OFFICE_PATH = "forms/libreoffice";
17
+ static readonly CHROMIUM_ROUTES: {
18
+ url: ChromiumRoute;
19
+ html: ChromiumRoute;
20
+ markdown: ChromiumRoute;
21
+ };
22
+ static readonly PDF_ENGINE_ROUTES: {
23
+ merge: PdfEngineRoute;
24
+ };
25
+ static readonly LIBRE_OFFICE_ROUTES: {
26
+ convert: LibreOfficeRoute;
16
27
  };
17
28
  }
29
+ export {};
@@ -1,24 +1,37 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Chromiumly = exports.Route = void 0;
3
+ exports.Chromiumly = exports.ChromiumRoute = void 0;
4
4
  const gotenberg_1 = require("./gotenberg");
5
- var Route;
6
- (function (Route) {
7
- Route["URL"] = "url";
8
- Route["HTML"] = "html";
9
- Route["MARKDOWN"] = "markdown";
10
- })(Route = exports.Route || (exports.Route = {}));
5
+ var ChromiumRoute;
6
+ (function (ChromiumRoute) {
7
+ ChromiumRoute["URL"] = "url";
8
+ ChromiumRoute["HTML"] = "html";
9
+ ChromiumRoute["MARKDOWN"] = "markdown";
10
+ })(ChromiumRoute = exports.ChromiumRoute || (exports.ChromiumRoute = {}));
11
+ var PdfEngineRoute;
12
+ (function (PdfEngineRoute) {
13
+ PdfEngineRoute["MERGE"] = "merge";
14
+ })(PdfEngineRoute || (PdfEngineRoute = {}));
15
+ var LibreOfficeRoute;
16
+ (function (LibreOfficeRoute) {
17
+ LibreOfficeRoute["CONVERT"] = "convert";
18
+ })(LibreOfficeRoute || (LibreOfficeRoute = {}));
11
19
  class Chromiumly {
12
20
  }
13
21
  exports.Chromiumly = Chromiumly;
14
22
  Chromiumly.GOTENBERG_ENDPOINT = gotenberg_1.Gotenberg.endpoint;
15
- Chromiumly.PATH = "forms/chromium/convert";
16
- Chromiumly.ROUTES = {
17
- url: Route.URL,
18
- html: Route.HTML,
19
- markdown: Route.MARKDOWN,
23
+ Chromiumly.CHROMIUM_PATH = "forms/chromium/convert";
24
+ Chromiumly.PDF_ENGINES_PATH = "forms/pdfengines";
25
+ Chromiumly.LIBRE_OFFICE_PATH = "forms/libreoffice";
26
+ Chromiumly.CHROMIUM_ROUTES = {
27
+ url: ChromiumRoute.URL,
28
+ html: ChromiumRoute.HTML,
29
+ markdown: ChromiumRoute.MARKDOWN,
30
+ };
31
+ Chromiumly.PDF_ENGINE_ROUTES = {
32
+ merge: PdfEngineRoute.MERGE,
33
+ };
34
+ Chromiumly.LIBRE_OFFICE_ROUTES = {
35
+ convert: LibreOfficeRoute.CONVERT,
20
36
  };
21
- Chromiumly.endpoint = Chromiumly.GOTENBERG_ENDPOINT;
22
- Chromiumly.path = Chromiumly.PATH;
23
- Chromiumly.routes = Chromiumly.ROUTES;
24
37
  //# sourceMappingURL=main.config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.config.js","sourceRoot":"","sources":["../src/main.config.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AAExC,IAAY,KAIX;AAJD,WAAY,KAAK;IACf,oBAAW,CAAA;IACX,sBAAa,CAAA;IACb,8BAAqB,CAAA;AACvB,CAAC,EAJW,KAAK,GAAL,aAAK,KAAL,aAAK,QAIhB;AAED,MAAa,UAAU;;AAAvB,gCAcC;AAbyB,6BAAkB,GAAG,qBAAS,CAAC,QAAQ,CAAC;AAExC,eAAI,GAAG,wBAAwB,CAAC;AAEhC,iBAAM,GAAG;IAC/B,GAAG,EAAE,KAAK,CAAC,GAAG;IACd,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;CACzB,CAAC;AAEqB,mBAAQ,GAAG,UAAU,CAAC,kBAAkB,CAAC;AACzC,eAAI,GAAG,UAAU,CAAC,IAAI,CAAC;AACvB,iBAAM,GAAG,UAAU,CAAC,MAAM,CAAC"}
1
+ {"version":3,"file":"main.config.js","sourceRoot":"","sources":["../src/main.config.ts"],"names":[],"mappings":";;;AAAA,2CAAwC;AAExC,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,4BAAW,CAAA;IACX,8BAAa,CAAA;IACb,sCAAqB,CAAA;AACvB,CAAC,EAJW,aAAa,GAAb,qBAAa,KAAb,qBAAa,QAIxB;AAED,IAAK,cAEJ;AAFD,WAAK,cAAc;IACjB,iCAAe,CAAA;AACjB,CAAC,EAFI,cAAc,KAAd,cAAc,QAElB;AAED,IAAK,gBAEJ;AAFD,WAAK,gBAAgB;IACnB,uCAAmB,CAAA;AACrB,CAAC,EAFI,gBAAgB,KAAhB,gBAAgB,QAEpB;AACD,MAAa,UAAU;;AAAvB,gCAoBC;AAnBwB,6BAAkB,GAAG,qBAAS,CAAC,QAAQ,CAAC;AAExC,wBAAa,GAAG,wBAAwB,CAAC;AACzC,2BAAgB,GAAG,kBAAkB,CAAC;AACtC,4BAAiB,GAAG,mBAAmB,CAAC;AAExC,0BAAe,GAAG;IACvC,GAAG,EAAE,aAAa,CAAC,GAAG;IACtB,IAAI,EAAE,aAAa,CAAC,IAAI;IACxB,QAAQ,EAAE,aAAa,CAAC,QAAQ;CACjC,CAAC;AAEqB,4BAAiB,GAAG;IACzC,KAAK,EAAE,cAAc,CAAC,KAAK;CAC5B,CAAC;AAEqB,8BAAmB,GAAG;IAC3C,OAAO,EAAE,gBAAgB,CAAC,OAAO;CAClC,CAAC"}
package/dist/main.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { HtmlConverter } from "./converters/html.converter";
2
- export { MarkdownConverter } from "./converters/markdown.converter";
3
- export { UrlConverter } from "./converters/url.converter";
1
+ export { PdfFormat } from "./common/constants";
2
+ export { HtmlConverter, MarkdownConverter, UrlConverter } from "./chromium";
3
+ export { PDFEngine } from "./pdf-engines";
package/dist/main.js CHANGED
@@ -1,10 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.UrlConverter = exports.MarkdownConverter = exports.HtmlConverter = void 0;
4
- var html_converter_1 = require("./converters/html.converter");
5
- Object.defineProperty(exports, "HtmlConverter", { enumerable: true, get: function () { return html_converter_1.HtmlConverter; } });
6
- var markdown_converter_1 = require("./converters/markdown.converter");
7
- Object.defineProperty(exports, "MarkdownConverter", { enumerable: true, get: function () { return markdown_converter_1.MarkdownConverter; } });
8
- var url_converter_1 = require("./converters/url.converter");
9
- Object.defineProperty(exports, "UrlConverter", { enumerable: true, get: function () { return url_converter_1.UrlConverter; } });
3
+ exports.PDFEngine = exports.UrlConverter = exports.MarkdownConverter = exports.HtmlConverter = exports.PdfFormat = void 0;
4
+ var constants_1 = require("./common/constants");
5
+ Object.defineProperty(exports, "PdfFormat", { enumerable: true, get: function () { return constants_1.PdfFormat; } });
6
+ var chromium_1 = require("./chromium");
7
+ Object.defineProperty(exports, "HtmlConverter", { enumerable: true, get: function () { return chromium_1.HtmlConverter; } });
8
+ Object.defineProperty(exports, "MarkdownConverter", { enumerable: true, get: function () { return chromium_1.MarkdownConverter; } });
9
+ Object.defineProperty(exports, "UrlConverter", { enumerable: true, get: function () { return chromium_1.UrlConverter; } });
10
+ var pdf_engines_1 = require("./pdf-engines");
11
+ Object.defineProperty(exports, "PDFEngine", { enumerable: true, get: function () { return pdf_engines_1.PDFEngine; } });
10
12
  //# sourceMappingURL=main.js.map
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;;AAAA,8DAA4D;AAAnD,+GAAA,aAAa,OAAA;AACtB,sEAAoE;AAA3D,uHAAA,iBAAiB,OAAA;AAC1B,4DAA0D;AAAjD,6GAAA,YAAY,OAAA"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;;AAAA,gDAA+C;AAAtC,sGAAA,SAAS,OAAA;AAClB,uCAA4E;AAAnE,yGAAA,aAAa,OAAA;AAAE,6GAAA,iBAAiB,OAAA;AAAE,wGAAA,YAAY,OAAA;AACvD,6CAA0C;AAAjC,wGAAA,SAAS,OAAA"}
@@ -0,0 +1 @@
1
+ export { PDFEngine } from "./pdf.engine";
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PDFEngine = void 0;
4
+ var pdf_engine_1 = require("./pdf.engine");
5
+ Object.defineProperty(exports, "PDFEngine", { enumerable: true, get: function () { return pdf_engine_1.PDFEngine; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pdf-engines/index.ts"],"names":[],"mappings":";;;AAAA,2CAAyC;AAAhC,uGAAA,SAAS,OAAA"}
@@ -0,0 +1,16 @@
1
+ /// <reference types="node" />
2
+ import { PathLike } from "fs";
3
+ import { PdfFormat } from "../common";
4
+ import { PageProperties } from "../libre-office";
5
+ export declare class PDFEngine {
6
+ static merge({ files }: {
7
+ files: PathLike[];
8
+ }): Promise<Buffer>;
9
+ static convert({ files, properties, pdfFormat, merge, }: {
10
+ files: PathLike[];
11
+ properties?: PageProperties;
12
+ pdfFormat?: PdfFormat;
13
+ merge?: boolean;
14
+ }): Promise<Buffer>;
15
+ static generate(filename: string, buffer: Buffer): Promise<void>;
16
+ }
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PDFEngine = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const fs_1 = require("fs");
6
+ const path_1 = tslib_1.__importDefault(require("path"));
7
+ const form_data_1 = tslib_1.__importDefault(require("form-data"));
8
+ const main_config_1 = require("../main.config");
9
+ const common_1 = require("../common");
10
+ const libre_office_1 = require("../libre-office");
11
+ const engine_utils_1 = require("./utils/engine.utils");
12
+ class PDFEngine {
13
+ static merge({ files }) {
14
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
15
+ const data = new form_data_1.default();
16
+ yield engine_utils_1.PDFEngineUtils.injectFiles(files, data);
17
+ const endpoint = `${main_config_1.Chromiumly.GOTENBERG_ENDPOINT}/${main_config_1.Chromiumly.PDF_ENGINES_PATH}/${main_config_1.Chromiumly.PDF_ENGINE_ROUTES.merge}`;
18
+ return common_1.GotenbergUtils.fetch(endpoint, data);
19
+ });
20
+ }
21
+ static convert({ files, properties, pdfFormat, merge, }) {
22
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
23
+ const data = new form_data_1.default();
24
+ if (pdfFormat) {
25
+ data.append("pdfFormat", pdfFormat);
26
+ }
27
+ if (merge) {
28
+ data.append("merge", String(merge));
29
+ }
30
+ if (properties) {
31
+ libre_office_1.LibreOfficeUtils.injectPageProperties(data, properties);
32
+ }
33
+ yield libre_office_1.LibreOfficeUtils.injectFiles(files, data);
34
+ const endpoint = `${main_config_1.Chromiumly.GOTENBERG_ENDPOINT}/${main_config_1.Chromiumly.LIBRE_OFFICE_PATH}/${main_config_1.Chromiumly.LIBRE_OFFICE_ROUTES.convert}`;
35
+ return common_1.GotenbergUtils.fetch(endpoint, data);
36
+ });
37
+ }
38
+ static generate(filename, buffer) {
39
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
40
+ const __generated__ = path_1.default.resolve(process.cwd(), "__generated__");
41
+ yield fs_1.promises.mkdir(path_1.default.resolve(__generated__), { recursive: true });
42
+ yield fs_1.promises.writeFile(path_1.default.resolve(__generated__, filename), buffer);
43
+ });
44
+ }
45
+ }
46
+ exports.PDFEngine = PDFEngine;
47
+ //# sourceMappingURL=pdf.engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf.engine.js","sourceRoot":"","sources":["../../src/pdf-engines/pdf.engine.ts"],"names":[],"mappings":";;;;AAAA,2BAAwC;AACxC,wDAAwB;AAExB,kEAAiC;AAEjC,gDAA4C;AAC5C,sCAAsD;AACtD,kDAAmE;AACnE,uDAAsD;AAEtD,MAAa,SAAS;IACb,MAAM,CAAO,KAAK,CAAC,EAAE,KAAK,EAAyB;;YACxD,MAAM,IAAI,GAAG,IAAI,mBAAQ,EAAE,CAAC;YAC5B,MAAM,6BAAc,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,GAAG,wBAAU,CAAC,kBAAkB,IAAI,wBAAU,CAAC,gBAAgB,IAAI,wBAAU,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;YACzH,OAAO,uBAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;KAAA;IAEM,MAAM,CAAO,OAAO,CAAC,EAC1B,KAAK,EACL,UAAU,EACV,SAAS,EACT,KAAK,GAMN;;YACC,MAAM,IAAI,GAAG,IAAI,mBAAQ,EAAE,CAAC;YAC5B,IAAI,SAAS,EAAE;gBACb,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;aACrC;YACD,IAAI,KAAK,EAAE;gBACT,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;aACrC;YACD,IAAI,UAAU,EAAE;gBACd,+BAAgB,CAAC,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;aACzD;YACD,MAAM,+BAAgB,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,GAAG,wBAAU,CAAC,kBAAkB,IAAI,wBAAU,CAAC,iBAAiB,IAAI,wBAAU,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;YAC9H,OAAO,uBAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;KAAA;IAEM,MAAM,CAAO,QAAQ,CAC1B,QAAgB,EAChB,MAAc;;YAEd,MAAM,aAAa,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;YACnE,MAAM,aAAQ,CAAC,KAAK,CAAC,cAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvE,MAAM,aAAQ,CAAC,SAAS,CAAC,cAAI,CAAC,OAAO,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1E,CAAC;KAAA;CACF;AA1CD,8BA0CC"}
@@ -0,0 +1,6 @@
1
+ /// <reference types="node" />
2
+ import { PathLike } from "fs";
3
+ import FormData from "form-data";
4
+ export declare class PDFEngineUtils {
5
+ static injectFiles(files: PathLike[], data: FormData): Promise<void>;
6
+ }
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PDFEngineUtils = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const fs_1 = require("fs");
6
+ const path_1 = tslib_1.__importDefault(require("path"));
7
+ class PDFEngineUtils {
8
+ static injectFiles(files, data) {
9
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
10
+ for (const file of files) {
11
+ try {
12
+ yield fs_1.promises.access(file, fs_1.constants.R_OK);
13
+ const filename = path_1.default.basename(file.toString());
14
+ const extension = path_1.default.extname(filename);
15
+ if (extension === ".pdf") {
16
+ data.append(filename, (0, fs_1.createReadStream)(file));
17
+ }
18
+ else {
19
+ throw new Error(`${extension} is not supported`);
20
+ }
21
+ }
22
+ catch (error) {
23
+ throw error;
24
+ }
25
+ }
26
+ });
27
+ }
28
+ }
29
+ exports.PDFEngineUtils = PDFEngineUtils;
30
+ //# sourceMappingURL=engine.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.utils.js","sourceRoot":"","sources":["../../../src/pdf-engines/utils/engine.utils.ts"],"names":[],"mappings":";;;;AAAA,2BAAqE;AACrE,wDAAwB;AAIxB,MAAa,cAAc;IAClB,MAAM,CAAO,WAAW,CAAC,KAAiB,EAAE,IAAc;;YAC/D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;gBACxB,IAAI;oBACF,MAAM,aAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,cAAS,CAAC,IAAI,CAAC,CAAC;oBAC5C,MAAM,QAAQ,GAAG,cAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAChD,MAAM,SAAS,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBACzC,IAAI,SAAS,KAAK,MAAM,EAAE;wBACxB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAA,qBAAgB,EAAC,IAAI,CAAC,CAAC,CAAC;qBAC/C;yBAAM;wBACL,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,mBAAmB,CAAC,CAAC;qBAClD;iBACF;gBAAC,OAAO,KAAK,EAAE;oBACd,MAAM,KAAK,CAAC;iBACb;aACF;QACH,CAAC;KAAA;CACF;AAjBD,wCAiBC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "chromiumly",
3
- "version": "1.0.4",
4
- "description": "A lightweight Typescrpit library which interacts with Gotenberg's Chromium module to convert HTML documents to PDF.",
3
+ "version": "2.0.2",
4
+ "description": "A lightweight Typescrpit library which interacts with Gotenberg's different modules to convert a variety of document formats to PDF files.",
5
5
  "main": "dist/main.js",
6
6
  "types": "dist/main.d.ts",
7
7
  "files": [
@@ -20,6 +20,7 @@
20
20
  "keywords": [
21
21
  "gotenberg",
22
22
  "chromium",
23
+ "LibreOffice",
23
24
  "html",
24
25
  "markdown",
25
26
  "pdf"
@@ -27,17 +28,23 @@
27
28
  "scripts": {
28
29
  "clean": "rm -rf dist build",
29
30
  "lint": "eslint src/ --ext .js,.ts",
30
- "build": "yarn clean && tsc -p tsconfig.json"
31
+ "build": "yarn clean && tsc -p tsconfig.json",
32
+ "test": "jest --runInBand --ci --coverage --reporters=default --reporters=jest-junit"
31
33
  },
32
34
  "devDependencies": {
35
+ "@babel/preset-typescript": "^7.16.7",
33
36
  "@types/config": "^0.0.41",
34
37
  "@types/dotenv": "^8.2.0",
35
38
  "@types/form-data": "^2.5.0",
39
+ "@types/jest": "^27.4.1",
36
40
  "@types/node": "^17.0.22",
37
41
  "@types/node-fetch": "2",
38
42
  "@typescript-eslint/eslint-plugin": "^5.16.0",
39
43
  "@typescript-eslint/parser": "^5.16.0",
40
44
  "eslint": "^8.11.0",
45
+ "jest": "^27.5.1",
46
+ "jest-junit": "^13.0.0",
47
+ "ts-jest": "^27.1.4",
41
48
  "ts-node": "^10.7.0",
42
49
  "typescript": "^4.6.2"
43
50
  },
@@ -0,0 +1,9 @@
1
+ import { Chromiumly, ChromiumRoute } from "../../main.config";
2
+
3
+ export abstract class Converter {
4
+ readonly endpoint: string;
5
+
6
+ constructor(route: ChromiumRoute) {
7
+ this.endpoint = `${Chromiumly.GOTENBERG_ENDPOINT}/${Chromiumly.CHROMIUM_PATH}/${Chromiumly.CHROMIUM_ROUTES[route]}`;
8
+ }
9
+ }
@@ -0,0 +1,41 @@
1
+ import { constants, createReadStream, PathLike, promises } from "fs";
2
+
3
+ import FormData from "form-data";
4
+
5
+ import { GotenbergUtils, PdfFormat } from "../../common";
6
+ import { IConverter } from "../interfaces/converter.interface";
7
+ import { PageProperties } from "../interfaces/converter.types";
8
+ import { ConverterUtils } from "../utils/converter.utils";
9
+ import { Converter } from "./converter";
10
+ import { ChromiumRoute } from "../../main.config";
11
+
12
+ export class HtmlConverter extends Converter implements IConverter {
13
+ constructor() {
14
+ super(ChromiumRoute.HTML);
15
+ }
16
+
17
+ async convert({
18
+ html,
19
+ properties,
20
+ pdfFormat,
21
+ }: {
22
+ html: PathLike;
23
+ properties?: PageProperties;
24
+ pdfFormat?: PdfFormat;
25
+ }): Promise<Buffer> {
26
+ try {
27
+ await promises.access(html, constants.R_OK);
28
+ const data = new FormData();
29
+ if (pdfFormat) {
30
+ data.append("pdfFormat", pdfFormat);
31
+ }
32
+ data.append("index.html", createReadStream(html));
33
+ if (properties) {
34
+ ConverterUtils.injectPageProperties(data, properties);
35
+ }
36
+ return GotenbergUtils.fetch(this.endpoint, data);
37
+ } catch (error) {
38
+ throw error;
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,45 @@
1
+ import { constants, createReadStream, PathLike, promises } from "fs";
2
+
3
+ import FormData from "form-data";
4
+
5
+ import { GotenbergUtils, PdfFormat } from "../../common";
6
+ import { IConverter } from "../interfaces/converter.interface";
7
+ import { PageProperties } from "../interfaces/converter.types";
8
+ import { ConverterUtils } from "../utils/converter.utils";
9
+ import { Converter } from "./converter";
10
+ import { ChromiumRoute } from "../../main.config";
11
+
12
+ export class MarkdownConverter extends Converter implements IConverter {
13
+ constructor() {
14
+ super(ChromiumRoute.MARKDOWN);
15
+ }
16
+
17
+ async convert({
18
+ html,
19
+ markdown,
20
+ properties,
21
+ pdfFormat,
22
+ }: {
23
+ html: PathLike;
24
+ markdown: PathLike;
25
+ properties?: PageProperties;
26
+ pdfFormat?: PdfFormat;
27
+ }): Promise<Buffer> {
28
+ try {
29
+ await promises.access(html, constants.R_OK);
30
+ await promises.access(markdown, constants.R_OK);
31
+ const data = new FormData();
32
+ if (pdfFormat) {
33
+ data.append("pdfFormat", pdfFormat);
34
+ }
35
+ data.append("index.html", createReadStream(html));
36
+ data.append("file.md", createReadStream(markdown));
37
+ if (properties) {
38
+ ConverterUtils.injectPageProperties(data, properties);
39
+ }
40
+ return GotenbergUtils.fetch(this.endpoint, data);
41
+ } catch (error) {
42
+ throw error;
43
+ }
44
+ }
45
+ }
@@ -0,0 +1,95 @@
1
+ import { promises, createReadStream } from "fs";
2
+
3
+ import fetch from "node-fetch";
4
+ import FormData from "form-data";
5
+
6
+ import { PdfFormat } from "../../../common";
7
+ import { HtmlConverter } from "../html.converter";
8
+
9
+ const { Response } = jest.requireActual("node-fetch");
10
+ jest.mock("node-fetch", () => jest.fn());
11
+
12
+ describe("HtmlConverter", () => {
13
+ const mockPromisesAccess = jest.spyOn(promises, "access");
14
+ const mockFetch = fetch as jest.MockedFunction<typeof fetch>;
15
+ const mockFormDataAppend = jest.spyOn(FormData.prototype, "append");
16
+
17
+ const converter = new HtmlConverter();
18
+ beforeEach(() => {
19
+ (createReadStream as jest.Mock) = jest
20
+ .fn()
21
+ .mockImplementation((file) => file);
22
+ });
23
+
24
+ afterEach(() => {
25
+ jest.resetAllMocks();
26
+ });
27
+
28
+ describe("endpoint", () => {
29
+ it("should route to Chromium HTML route", () => {
30
+ expect(converter.endpoint).toEqual(
31
+ "http://localhost:3000/forms/chromium/convert/html"
32
+ );
33
+ });
34
+ });
35
+
36
+ describe("convert", () => {
37
+ describe("when file exists", () => {
38
+ it("should return a buffer", async () => {
39
+ mockPromisesAccess.mockResolvedValue();
40
+ mockFetch.mockResolvedValue(new Response("content"));
41
+ const buffer = await converter.convert({ html: "path/to/index.html" });
42
+ expect(buffer).toEqual(Buffer.from("content"));
43
+ });
44
+ });
45
+
46
+ describe("when pdf format parameter is passed", () => {
47
+ it("should return a buffer", async () => {
48
+ mockPromisesAccess.mockResolvedValue();
49
+ mockFetch.mockResolvedValue(new Response("content"));
50
+ const buffer = await converter.convert({
51
+ html: "path/to/index.html",
52
+ pdfFormat: PdfFormat.A_1a,
53
+ });
54
+ expect(mockFormDataAppend).toBeCalledTimes(2);
55
+ expect(buffer).toEqual(Buffer.from("content"));
56
+ });
57
+ });
58
+
59
+ describe("when page properties parameter is passed", () => {
60
+ it("should return a buffer", async () => {
61
+ mockPromisesAccess.mockResolvedValue();
62
+ mockFetch.mockResolvedValue(new Response("content"));
63
+ const buffer = await converter.convert({
64
+ html: "path/to/index.html",
65
+ properties: { size: { width: 8.3, height: 11.7 } },
66
+ });
67
+ expect(mockFormDataAppend).toBeCalledTimes(3);
68
+ expect(buffer).toEqual(Buffer.from("content"));
69
+ });
70
+ });
71
+
72
+ describe("when file does not exist", () => {
73
+ it("should throw an error", async () => {
74
+ const errorMessage =
75
+ "ENOENT: no such file or directory, access 'path/to/index.html'";
76
+ mockPromisesAccess.mockRejectedValue(new Error(errorMessage));
77
+ await expect(() =>
78
+ converter.convert({ html: "path/to/index.html" })
79
+ ).rejects.toThrow(errorMessage);
80
+ });
81
+ });
82
+
83
+ describe("when fetch request fails", () => {
84
+ it("should throw an error", async () => {
85
+ const errorMessage =
86
+ "FetchError: request to http://localhost:3000/forms/chromium/convert/html failed";
87
+ mockPromisesAccess.mockResolvedValue();
88
+ mockFetch.mockRejectedValue(new Error(errorMessage));
89
+ await expect(() =>
90
+ converter.convert({ html: "path/to/index.html" })
91
+ ).rejects.toThrow(errorMessage);
92
+ });
93
+ });
94
+ });
95
+ });