@tstdl/base 0.90.47 → 0.90.48
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 +7 -7
- package/pdf/pdf.service.d.ts +2 -4
- package/pdf/pdf.service.js +93 -21
- package/reflection/decorators.d.ts +1 -1
- package/reflection/decorators.js +1 -1
- package/templates/template-renderer.provider.d.ts +1 -1
- package/templates/template-renderer.provider.js +3 -2
- package/templates/template-resolver.provider.d.ts +1 -1
- package/templates/template-resolver.provider.js +3 -2
- package/utils/date-time.js +5 -1
- package/utils/reflection.d.ts +1 -1
- package/utils/reflection.js +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tstdl/base",
|
|
3
|
-
"version": "0.90.
|
|
3
|
+
"version": "0.90.48",
|
|
4
4
|
"author": "Patrick Hein",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
"dependencies": {
|
|
107
107
|
"disposablestack": "^1.1",
|
|
108
108
|
"luxon": "^3.4",
|
|
109
|
-
"reflect-metadata": "^0.
|
|
109
|
+
"reflect-metadata": "^0.2",
|
|
110
110
|
"rxjs": "^7.8",
|
|
111
111
|
"type-fest": "4.7"
|
|
112
112
|
},
|
|
@@ -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.
|
|
123
|
-
"@typescript-eslint/parser": "6.
|
|
122
|
+
"@typescript-eslint/eslint-plugin": "6.14",
|
|
123
|
+
"@typescript-eslint/parser": "6.14",
|
|
124
124
|
"concurrently": "8.2",
|
|
125
125
|
"esbuild": "0.19",
|
|
126
|
-
"eslint": "8.
|
|
126
|
+
"eslint": "8.55",
|
|
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.
|
|
135
|
+
"@elastic/elasticsearch": "^8.11",
|
|
136
136
|
"@koa/router": "^12.0",
|
|
137
137
|
"@tstdl/angular": "^0.90",
|
|
138
138
|
"@zxcvbn-ts/core": "^3.0",
|
|
@@ -149,7 +149,7 @@
|
|
|
149
149
|
"playwright": "^1.40",
|
|
150
150
|
"preact": "^10.19",
|
|
151
151
|
"preact-render-to-string": "^6.3",
|
|
152
|
-
"undici": "^
|
|
152
|
+
"undici": "^6.0",
|
|
153
153
|
"urlpattern-polyfill": "^9.0"
|
|
154
154
|
},
|
|
155
155
|
"peerDependenciesMeta": {
|
package/pdf/pdf.service.d.ts
CHANGED
|
@@ -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
|
|
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: {
|
package/pdf/pdf.service.js
CHANGED
|
@@ -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
|
|
16
|
-
|
|
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 {
|
|
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';
|
package/reflection/decorators.js
CHANGED
|
@@ -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
|
|
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
|
|
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/utils/date-time.js
CHANGED
|
@@ -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
|
-
|
|
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 });
|
package/utils/reflection.d.ts
CHANGED
|
@@ -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;
|
package/utils/reflection.js
CHANGED
|
@@ -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
|
}
|