@tstdl/base 0.90.47 → 0.90.49

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tstdl/base",
3
- "version": "0.90.47",
3
+ "version": "0.90.49",
4
4
  "author": "Patrick Hein",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -106,9 +106,9 @@
106
106
  "dependencies": {
107
107
  "disposablestack": "^1.1",
108
108
  "luxon": "^3.4",
109
- "reflect-metadata": "^0.1",
109
+ "reflect-metadata": "^0.2",
110
110
  "rxjs": "^7.8",
111
- "type-fest": "4.7"
111
+ "type-fest": "4.9"
112
112
  },
113
113
  "devDependencies": {
114
114
  "@mxssfd/typedoc-theme": "1.1",
@@ -119,11 +119,11 @@
119
119
  "@types/mjml": "4.7",
120
120
  "@types/node": "20",
121
121
  "@types/nodemailer": "6.4",
122
- "@typescript-eslint/eslint-plugin": "6.12",
123
- "@typescript-eslint/parser": "6.12",
122
+ "@typescript-eslint/eslint-plugin": "6.16",
123
+ "@typescript-eslint/parser": "6.16",
124
124
  "concurrently": "8.2",
125
125
  "esbuild": "0.19",
126
- "eslint": "8.54",
126
+ "eslint": "8.56",
127
127
  "eslint-import-resolver-typescript": "3.6",
128
128
  "eslint-plugin-import": "2.29",
129
129
  "tsc-alias": "1.8",
@@ -132,7 +132,7 @@
132
132
  "typescript": "5.3"
133
133
  },
134
134
  "peerDependencies": {
135
- "@elastic/elasticsearch": "^8.10",
135
+ "@elastic/elasticsearch": "^8.11",
136
136
  "@koa/router": "^12.0",
137
137
  "@tstdl/angular": "^0.90",
138
138
  "@zxcvbn-ts/core": "^3.0",
@@ -141,7 +141,7 @@
141
141
  "@zxcvbn-ts/language-en": "^3.0",
142
142
  "chroma-js": "^2.4",
143
143
  "handlebars": "^4.7",
144
- "koa": "^2.14",
144
+ "koa": "^2.15",
145
145
  "minio": "^7.1",
146
146
  "mjml": "^4.14",
147
147
  "mongodb": "^6.3",
@@ -149,7 +149,7 @@
149
149
  "playwright": "^1.40",
150
150
  "preact": "^10.19",
151
151
  "preact-render-to-string": "^6.3",
152
- "undici": "^5.27",
152
+ "undici": "^6.2",
153
153
  "urlpattern-polyfill": "^9.0"
154
154
  },
155
155
  "peerDependenciesMeta": {
@@ -5,14 +5,12 @@
5
5
  */
6
6
  import { BrowserContextController } from '../browser/browser-context-controller.js';
7
7
  import type { BrowserControllerArgument } from '../browser/browser-controller.js';
8
- import { BrowserController } from '../browser/browser-controller.js';
9
8
  import { PdfRenderOptions } from '../browser/pdf-options.js';
10
9
  import type { Resolvable } from '../injector/index.js';
11
10
  import { resolveArgumentType } from '../injector/index.js';
12
11
  import { LogLevel } from '../logger/level.js';
13
- import { Logger } from '../logger/logger.js';
14
12
  import type { TemplateField } from '../templates/index.js';
15
- import { Template, TemplateService } from '../templates/index.js';
13
+ import { Template } from '../templates/index.js';
16
14
  export declare class PdfServiceRenderOptions extends PdfRenderOptions {
17
15
  browserContext?: BrowserContextController;
18
16
  locale?: string;
@@ -50,7 +48,6 @@ export declare class PdfService implements Resolvable<PdfServiceArgument> {
50
48
  private readonly logger;
51
49
  private readonly defaultLocale;
52
50
  readonly [resolveArgumentType]: PdfServiceArgument;
53
- constructor(templateService: TemplateService, browserController: BrowserController, logger: Logger, options?: PdfServiceOptions);
54
51
  /**
55
52
  * Renders HTML to pdf stream
56
53
  * @param html html to render
@@ -95,6 +92,7 @@ export declare class PdfService implements Resolvable<PdfServiceArgument> {
95
92
  * @returns pdf bytes
96
93
  */
97
94
  renderTemplate(keyOrTemplate: string | PdfTemplate, templateContext?: object, options?: PdfServiceRenderOptions): Promise<Uint8Array>;
95
+ merge(pdfs: (string | Uint8Array)[]): Promise<Uint8Array>;
98
96
  private renderStream;
99
97
  }
100
98
  export declare function pdfTemplate(name: string, fields: {
@@ -12,13 +12,59 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
12
12
  var __metadata = (this && this.__metadata) || function (k, v) {
13
13
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
14
14
  };
15
- var __param = (this && this.__param) || function (paramIndex, decorator) {
16
- return function (target, key) { decorator(target, key, paramIndex); }
15
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
16
+ if (value !== null && value !== void 0) {
17
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
18
+ var dispose;
19
+ if (async) {
20
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
21
+ dispose = value[Symbol.asyncDispose];
22
+ }
23
+ if (dispose === void 0) {
24
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
25
+ dispose = value[Symbol.dispose];
26
+ }
27
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
28
+ env.stack.push({ value: value, dispose: dispose, async: async });
29
+ }
30
+ else if (async) {
31
+ env.stack.push({ async: true });
32
+ }
33
+ return value;
17
34
  };
35
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
36
+ return function (env) {
37
+ function fail(e) {
38
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
39
+ env.hasError = true;
40
+ }
41
+ function next() {
42
+ while (env.stack.length) {
43
+ var rec = env.stack.pop();
44
+ try {
45
+ var result = rec.dispose && rec.dispose.call(rec.value);
46
+ if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
47
+ }
48
+ catch (e) {
49
+ fail(e);
50
+ }
51
+ }
52
+ if (env.hasError) throw env.error;
53
+ }
54
+ return next();
55
+ };
56
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
57
+ var e = new Error(message);
58
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
59
+ });
60
+ import { execFile as execFileCallback } from 'node:child_process';
61
+ import { access, readFile, unlink, writeFile } from 'node:fs/promises';
62
+ import { promisify } from 'node:util';
63
+ import { tmpdir } from 'node:os';
18
64
  import { BrowserContextController } from '../browser/browser-context-controller.js';
19
65
  import { BrowserController } from '../browser/browser-controller.js';
20
66
  import { PdfRenderOptions } from '../browser/pdf-options.js';
21
- import { ForwardArg, InjectArg, ResolveArg, Singleton, resolveArgumentType } from '../injector/index.js';
67
+ import { Singleton, inject, injectArgument, resolveArgumentType } from '../injector/index.js';
22
68
  import { LogLevel } from '../logger/level.js';
23
69
  import { Logger } from '../logger/logger.js';
24
70
  import { Optional } from '../schema/index.js';
@@ -27,7 +73,8 @@ import { finalizeStream } from '../utils/stream/finalize-stream.js';
27
73
  import { readableStreamFromPromise } from '../utils/stream/readable-stream-from-promise.js';
28
74
  import { readBinaryStream } from '../utils/stream/stream-reader.js';
29
75
  import { timeout } from '../utils/timing.js';
30
- import { isDefined } from '../utils/type-guards.js';
76
+ import { isDefined, isString } from '../utils/type-guards.js';
77
+ const execFile = promisify(execFileCallback);
31
78
  export class PdfServiceRenderOptions extends PdfRenderOptions {
32
79
  browserContext;
33
80
  locale;
@@ -73,16 +120,10 @@ __decorate([
73
120
  ], PdfTemplate.prototype, "options", void 0);
74
121
  const browserArguments = ['--font-render-hinting=none', '--disable-web-security', '--disable-features=IsolateOrigins', '--disable-site-isolation-trials'];
75
122
  let PdfService = class PdfService {
76
- templateService;
77
- browserController;
78
- logger;
79
- defaultLocale;
80
- constructor(templateService, browserController, logger, options = {}) {
81
- this.templateService = templateService;
82
- this.browserController = browserController;
83
- this.logger = logger;
84
- this.defaultLocale = options.locale;
85
- }
123
+ templateService = inject(TemplateService);
124
+ browserController = inject(BrowserController, injectArgument(this, { optional: true })?.browserControllerArgument ?? { browserArguments });
125
+ logger = inject(Logger, 'PdfService');
126
+ defaultLocale = injectArgument(this, { optional: true })?.locale;
86
127
  /**
87
128
  * Renders HTML to pdf stream
88
129
  * @param html html to render
@@ -148,6 +189,43 @@ let PdfService = class PdfService {
148
189
  const stream = this.renderTemplateStream(keyOrTemplate, templateContext, options);
149
190
  return readBinaryStream(stream);
150
191
  }
192
+ async merge(pdfs) {
193
+ const env_1 = { stack: [], error: void 0, hasError: false };
194
+ try {
195
+ const stack = __addDisposableResource(env_1, new AsyncDisposableStack(), true);
196
+ const tmp = tmpdir();
197
+ const sourceFiles = await Promise.all(pdfs.map(async (pdf) => {
198
+ if (isString(pdf)) {
199
+ return pdf;
200
+ }
201
+ const file = `${tmp}/${crypto.randomUUID()}.pdf`;
202
+ await writeFile(file, pdf);
203
+ stack.defer(async () => unlink(file));
204
+ return file;
205
+ }));
206
+ const resultFile = `${tmp}/${crypto.randomUUID()}.pdf`;
207
+ const resultPromise = execFile('pdfunite', [...sourceFiles, resultFile]);
208
+ const result = await resultPromise;
209
+ try {
210
+ await access(resultFile);
211
+ stack.defer(async () => unlink(resultFile));
212
+ }
213
+ catch { /* ignore */ }
214
+ if (resultPromise.child.exitCode != 0) {
215
+ throw new Error(result.stderr);
216
+ }
217
+ return readFile(resultFile);
218
+ }
219
+ catch (e_1) {
220
+ env_1.error = e_1;
221
+ env_1.hasError = true;
222
+ }
223
+ finally {
224
+ const result_1 = __disposeResources(env_1);
225
+ if (result_1)
226
+ await result_1;
227
+ }
228
+ }
151
229
  renderStream(handler, options = {}) {
152
230
  return readableStreamFromPromise(async () => {
153
231
  const context = options.browserContext ?? await this.browserController.newContext({ locale: options.locale ?? this.defaultLocale });
@@ -180,13 +258,7 @@ let PdfService = class PdfService {
180
258
  }
181
259
  };
182
260
  PdfService = __decorate([
183
- Singleton(),
184
- __param(1, ForwardArg((argument) => argument?.browserControllerArgument ?? { browserArguments })),
185
- __param(2, ResolveArg('PdfService')),
186
- __param(3, InjectArg()),
187
- __metadata("design:paramtypes", [TemplateService,
188
- BrowserController,
189
- Logger, Object])
261
+ Singleton()
190
262
  ], PdfService);
191
263
  export { PdfService };
192
264
  export function pdfTemplate(name, fields, options) {
@@ -1,4 +1,4 @@
1
- import 'reflect-metadata';
1
+ import 'reflect-metadata/lite';
2
2
  import type { ConstructorParameterDecorator } from '../types.js';
3
3
  import type { Decorator, DecoratorHandler } from './types.js';
4
4
  import type { CreateDecoratorOptions, SpecificCreateDecoratorOptions } from './utils.js';
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable @typescript-eslint/naming-convention */
2
- import 'reflect-metadata'; // eslint-disable-line import/no-unassigned-import
2
+ import 'reflect-metadata/lite'; // eslint-disable-line import/no-unassigned-import
3
3
  import { noop } from '../utils/noop.js';
4
4
  import { createAccessorDecorator, createClassDecorator, createConstructorParameterDecorator, createDecorator, createMethodDecorator, createMethodParameterDecorator, createParameterDecorator, createPropertyDecorator, createPropertyOrAccessorDecorator } from './utils.js';
5
5
  export function Decorate({ handler, ...options } = {}) {
@@ -1,7 +1,7 @@
1
1
  import type { TemplateRenderer } from './template.renderer.js';
2
2
  export declare class TemplateRendererProvider {
3
3
  private readonly renderers;
4
- constructor(renderers: TemplateRenderer[]);
4
+ constructor(renderers?: TemplateRenderer[]);
5
5
  register(renderer: TemplateRenderer): void;
6
6
  has(type: string): boolean;
7
7
  get(type: string): TemplateRenderer;
@@ -10,11 +10,11 @@ var __metadata = (this && this.__metadata) || function (k, v) {
10
10
  var __param = (this && this.__param) || function (paramIndex, decorator) {
11
11
  return function (target, key) { decorator(target, key, paramIndex); }
12
12
  };
13
- import { Inject, Singleton } from '../injector/decorators.js';
13
+ import { Inject, Optional, Singleton } from '../injector/decorators.js';
14
14
  import { TEMPLATE_RENDERERS } from './tokens.js';
15
15
  let TemplateRendererProvider = class TemplateRendererProvider {
16
16
  renderers;
17
- constructor(renderers) {
17
+ constructor(renderers = []) {
18
18
  this.renderers = new Set(renderers);
19
19
  }
20
20
  register(renderer) {
@@ -40,6 +40,7 @@ let TemplateRendererProvider = class TemplateRendererProvider {
40
40
  TemplateRendererProvider = __decorate([
41
41
  Singleton(),
42
42
  __param(0, Inject(TEMPLATE_RENDERERS)),
43
+ __param(0, Optional()),
43
44
  __metadata("design:paramtypes", [Array])
44
45
  ], TemplateRendererProvider);
45
46
  export { TemplateRendererProvider };
@@ -1,7 +1,7 @@
1
1
  import type { TemplateResolver } from './template.resolver.js';
2
2
  export declare class TemplateResolverProvider {
3
3
  private readonly resolvers;
4
- constructor(resolvers: TemplateResolver[]);
4
+ constructor(resolvers?: TemplateResolver[]);
5
5
  register(renderer: TemplateResolver): void;
6
6
  has(type: string): boolean;
7
7
  get(type: string): TemplateResolver;
@@ -10,11 +10,11 @@ var __metadata = (this && this.__metadata) || function (k, v) {
10
10
  var __param = (this && this.__param) || function (paramIndex, decorator) {
11
11
  return function (target, key) { decorator(target, key, paramIndex); }
12
12
  };
13
- import { Inject, Singleton } from '../injector/decorators.js';
13
+ import { Inject, Optional, Singleton } from '../injector/decorators.js';
14
14
  import { TEMPLATE_RESOLVERS } from './tokens.js';
15
15
  let TemplateResolverProvider = class TemplateResolverProvider {
16
16
  resolvers;
17
- constructor(resolvers) {
17
+ constructor(resolvers = []) {
18
18
  this.resolvers = new Set(resolvers);
19
19
  }
20
20
  register(renderer) {
@@ -40,6 +40,7 @@ let TemplateResolverProvider = class TemplateResolverProvider {
40
40
  TemplateResolverProvider = __decorate([
41
41
  Singleton(),
42
42
  __param(0, Inject(TEMPLATE_RESOLVERS)),
43
+ __param(0, Optional()),
43
44
  __metadata("design:paramtypes", [Array])
44
45
  ], TemplateResolverProvider);
45
46
  export { TemplateResolverProvider };
package/types.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { Observable } from 'rxjs';
2
- import type { Except } from 'type-fest';
2
+ import type { CamelCase, Except } from 'type-fest';
3
3
  import type { Signal } from './signals/api.js';
4
4
  export type ObjectLiteral = {};
5
5
  export type PrimitiveTypeMap = {
@@ -193,4 +193,5 @@ export type TypeFromPath<T extends Record, Path extends Paths<T> | string> = {
193
193
  }[Path];
194
194
  export type ConstructorParameterDecorator = (target: Object, propertyKey: undefined, parameterIndex: number) => void;
195
195
  export type ReactiveValue<T> = T | Signal<T> | Observable<T>;
196
+ export type PascalCase<Value> = CamelCase<Value> extends string ? Capitalize<CamelCase<Value>> : CamelCase<Value>;
196
197
  export {};
@@ -96,7 +96,11 @@ export function numericDateToDateTime(numericDate, units, options) {
96
96
  return DateTime.fromObject({ ...date, ...units }, options);
97
97
  }
98
98
  export function dateTimeToTime(dateTime) {
99
- return dateTime.startOf('day').until(dateTime).count('milliseconds');
99
+ const interval = dateTime.startOf('day').until(dateTime);
100
+ if (interval.isValid) {
101
+ return interval.count('milliseconds');
102
+ }
103
+ throw new Error('Invalid DateTime.');
100
104
  }
101
105
  export function numericDateTimeToDateTime({ date, time }, zone) {
102
106
  return numericDateToDateTime(date, undefined, { zone }).set({ millisecond: time });
@@ -1,4 +1,4 @@
1
- import 'reflect-metadata';
1
+ import 'reflect-metadata/lite';
2
2
  import type { Type } from '../types.js';
3
3
  export declare function getDesignType(target: object, propertyKey?: string | symbol): Type;
4
4
  export declare function hasDesignType(target: object, propertyKey?: string | symbol): boolean;
@@ -1,4 +1,4 @@
1
- import 'reflect-metadata'; // eslint-disable-line import/no-unassigned-import
1
+ import 'reflect-metadata/lite'; // eslint-disable-line import/no-unassigned-import
2
2
  export function getDesignType(target, propertyKey) {
3
3
  return Reflect.getMetadata('design:type', target, propertyKey);
4
4
  }
@@ -1,5 +1,4 @@
1
- import type { AbstractConstructor, JsonPrimitive, Primitive, TypedArray } from '../types.js';
2
- import type { PascalCase } from 'type-fest';
1
+ import type { AbstractConstructor, JsonPrimitive, PascalCase, Primitive, TypedArray } from '../types.js';
3
2
  export type AssertionMessage = string | (() => string);
4
3
  export type IsFunction<T> = <U extends T = T>(value: any) => value is U;
5
4
  export type IsNotFunction<T> = <V>(value: V) => value is Exclude<V, T>;