@tstdl/base 0.90.46 → 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 +9 -9
- 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,8 +106,9 @@
|
|
|
106
106
|
"dependencies": {
|
|
107
107
|
"disposablestack": "^1.1",
|
|
108
108
|
"luxon": "^3.4",
|
|
109
|
-
"reflect-metadata": "^0.
|
|
110
|
-
"rxjs": "^7.8"
|
|
109
|
+
"reflect-metadata": "^0.2",
|
|
110
|
+
"rxjs": "^7.8",
|
|
111
|
+
"type-fest": "4.7"
|
|
111
112
|
},
|
|
112
113
|
"devDependencies": {
|
|
113
114
|
"@mxssfd/typedoc-theme": "1.1",
|
|
@@ -118,21 +119,20 @@
|
|
|
118
119
|
"@types/mjml": "4.7",
|
|
119
120
|
"@types/node": "20",
|
|
120
121
|
"@types/nodemailer": "6.4",
|
|
121
|
-
"@typescript-eslint/eslint-plugin": "6.
|
|
122
|
-
"@typescript-eslint/parser": "6.
|
|
122
|
+
"@typescript-eslint/eslint-plugin": "6.14",
|
|
123
|
+
"@typescript-eslint/parser": "6.14",
|
|
123
124
|
"concurrently": "8.2",
|
|
124
125
|
"esbuild": "0.19",
|
|
125
|
-
"eslint": "8.
|
|
126
|
+
"eslint": "8.55",
|
|
126
127
|
"eslint-import-resolver-typescript": "3.6",
|
|
127
128
|
"eslint-plugin-import": "2.29",
|
|
128
129
|
"tsc-alias": "1.8",
|
|
129
|
-
"type-fest": "4.7",
|
|
130
130
|
"typedoc": "0.25",
|
|
131
131
|
"typedoc-plugin-missing-exports": "2.1",
|
|
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
|
}
|