@tstdl/base 0.92.85 → 0.92.87

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 (152) hide show
  1. package/ai/ai.service.d.ts +4 -4
  2. package/ai/ai.service.js +27 -14
  3. package/ai/types.d.ts +5 -4
  4. package/api/server/gateway.js +1 -1
  5. package/authentication/authentication.api.d.ts +9 -9
  6. package/authentication/models/schemas.d.ts +2 -2
  7. package/authentication/server/authentication-ancillary.service.d.ts +6 -4
  8. package/authentication/server/authentication-ancillary.service.js +5 -5
  9. package/cancellation/token.d.ts +1 -1
  10. package/context/context.d.ts +1 -9
  11. package/context/context.js +8 -5
  12. package/document-management/api/document-management.api.d.ts +142 -110
  13. package/document-management/models/document-category.model.d.ts +1 -0
  14. package/document-management/models/document-category.model.js +2 -0
  15. package/document-management/models/document-collection-document.model.js +7 -3
  16. package/document-management/models/document-property-value.model.d.ts +13 -14
  17. package/document-management/models/document-property-value.model.js +60 -27
  18. package/document-management/models/document-property.model.d.ts +2 -0
  19. package/document-management/models/document-property.model.js +4 -1
  20. package/document-management/models/document-request-assignment-task-collection.model.d.ts +7 -0
  21. package/document-management/models/document-request-assignment-task-collection.model.js +32 -0
  22. package/document-management/models/document-request-assignment-task.model.d.ts +14 -0
  23. package/document-management/models/document-request-assignment-task.model.js +72 -0
  24. package/document-management/models/document-request-collection.model.d.ts +1 -0
  25. package/document-management/models/document-request-collection.model.js +7 -3
  26. package/document-management/models/document-request-file.model.d.ts +7 -2
  27. package/document-management/models/document-request-file.model.js +29 -4
  28. package/document-management/models/document-request.model.d.ts +1 -0
  29. package/document-management/models/document-requests-template.js +2 -0
  30. package/document-management/models/document-type-property.model.js +7 -3
  31. package/document-management/models/document-type.model.d.ts +1 -0
  32. package/document-management/models/document-type.model.js +7 -3
  33. package/document-management/models/document.model.d.ts +5 -2
  34. package/document-management/models/document.model.js +21 -6
  35. package/document-management/models/index.d.ts +2 -0
  36. package/document-management/models/index.js +2 -0
  37. package/document-management/models/service-models/document.service-model.d.ts +84 -65
  38. package/document-management/models/service-models/document.service-model.js +11 -6
  39. package/document-management/models/service-models/document.view-model.d.ts +1 -1
  40. package/document-management/models/service-models/document.view-model.js +2 -2
  41. package/document-management/server/drizzle/{0000_sloppy_fenris.sql → 0000_cool_victor_mancha.sql} +99 -43
  42. package/document-management/server/drizzle/meta/0000_snapshot.json +518 -130
  43. package/document-management/server/drizzle/meta/_journal.json +2 -2
  44. package/document-management/server/drizzle.config.js +1 -1
  45. package/document-management/server/module.d.ts +3 -2
  46. package/document-management/server/module.js +4 -2
  47. package/document-management/server/schemas.d.ts +36 -0
  48. package/document-management/server/schemas.js +37 -0
  49. package/document-management/server/services/document-management-ancillary.service.d.ts +4 -0
  50. package/document-management/server/services/document-management-ancillary.service.js +13 -0
  51. package/document-management/server/services/document-management.service.d.ts +71 -22
  52. package/document-management/server/services/document-management.service.js +528 -81
  53. package/document-management/server/services/index.d.ts +1 -0
  54. package/document-management/server/services/index.js +1 -0
  55. package/eslint.config.js +1 -0
  56. package/examples/document-management/main.d.ts +5 -0
  57. package/examples/document-management/main.js +20 -2
  58. package/examples/orm/schemas.d.ts +1 -1
  59. package/file/index.d.ts +1 -0
  60. package/file/index.js +1 -0
  61. package/file/temporary-file.d.ts +17 -0
  62. package/file/temporary-file.js +49 -0
  63. package/http/server/http-server-response.d.ts +2 -0
  64. package/http/server/http-server-response.js +13 -0
  65. package/injector/index.d.ts +1 -0
  66. package/injector/index.js +1 -0
  67. package/injector/injector.js +19 -7
  68. package/injector/interfaces.d.ts +1 -1
  69. package/injector/interfaces.js +1 -1
  70. package/injector/resolution.d.ts +15 -0
  71. package/injector/resolution.js +6 -0
  72. package/logger/console/logger.d.ts +1 -1
  73. package/logger/logger.d.ts +1 -1
  74. package/mail/drizzle.config.js +1 -1
  75. package/mail/models/schemas.d.ts +1 -1
  76. package/object-storage/object-storage.d.ts +5 -7
  77. package/object-storage/s3/s3.object-storage.d.ts +0 -1
  78. package/object-storage/s3/s3.object-storage.js +0 -3
  79. package/orm/{server/data-types → data-types}/numeric-date.js +2 -3
  80. package/orm/decorators.d.ts +17 -8
  81. package/orm/decorators.js +13 -7
  82. package/orm/entity.d.ts +5 -7
  83. package/orm/entity.js +11 -7
  84. package/orm/index.d.ts +2 -0
  85. package/orm/index.js +2 -0
  86. package/orm/query.d.ts +1 -3
  87. package/orm/query.js +0 -1
  88. package/orm/repository.types.d.ts +32 -0
  89. package/orm/repository.types.js +1 -0
  90. package/orm/server/database-schema.d.ts +4 -4
  91. package/orm/server/drizzle/schema-converter.d.ts +1 -1
  92. package/orm/server/drizzle/schema-converter.js +48 -19
  93. package/orm/server/index.d.ts +1 -0
  94. package/orm/server/index.js +1 -0
  95. package/orm/server/query-converter.d.ts +1 -2
  96. package/orm/server/query-converter.js +66 -61
  97. package/orm/server/repository.d.ts +80 -43
  98. package/orm/server/repository.js +219 -112
  99. package/orm/server/sqls.d.ts +15 -0
  100. package/orm/server/sqls.js +19 -0
  101. package/orm/server/types.d.ts +3 -3
  102. package/orm/types.d.ts +4 -4
  103. package/orm/utils.d.ts +3 -0
  104. package/orm/utils.js +6 -0
  105. package/package.json +23 -19
  106. package/pdf/pdf.service.d.ts +0 -1
  107. package/pdf/pdf.service.js +1 -95
  108. package/pdf/utils.d.ts +3 -1
  109. package/pdf/utils.js +129 -4
  110. package/promise/lazy-promise.d.ts +3 -3
  111. package/queue/enqueue-batch.d.ts +1 -0
  112. package/queue/enqueue-batch.js +1 -1
  113. package/queue/mongo/queue.d.ts +9 -4
  114. package/queue/mongo/queue.js +5 -6
  115. package/queue/postgres/drizzle/0000_zippy_moondragon.sql +11 -0
  116. package/queue/postgres/drizzle/meta/0000_snapshot.json +90 -0
  117. package/queue/postgres/drizzle/meta/_journal.json +13 -0
  118. package/queue/postgres/drizzle.config.d.ts +2 -0
  119. package/queue/postgres/drizzle.config.js +11 -0
  120. package/queue/postgres/index.d.ts +4 -0
  121. package/queue/postgres/index.js +4 -0
  122. package/queue/postgres/job.model.d.ts +13 -0
  123. package/queue/postgres/job.model.js +55 -0
  124. package/queue/postgres/module.d.ts +9 -0
  125. package/queue/postgres/module.js +29 -0
  126. package/queue/postgres/queue.d.ts +28 -0
  127. package/queue/postgres/queue.js +147 -0
  128. package/queue/postgres/queue.provider.d.ts +7 -0
  129. package/queue/postgres/queue.provider.js +21 -0
  130. package/queue/postgres/schemas.d.ts +3 -0
  131. package/queue/postgres/schemas.js +4 -0
  132. package/queue/provider.d.ts +2 -1
  133. package/queue/queue.d.ts +32 -6
  134. package/queue/queue.js +43 -0
  135. package/schema/schemas/object.d.ts +1 -1
  136. package/utils/date-time.d.ts +4 -2
  137. package/utils/date-time.js +10 -3
  138. package/utils/format-error.js +0 -1
  139. package/utils/object/lazy-property.js +0 -1
  140. package/utils/timing.d.ts +4 -3
  141. package/utils/timing.js +3 -1
  142. package/utils/try-ignore.d.ts +9 -2
  143. package/utils/try-ignore.js +30 -6
  144. package/document-management/models/schemas.d.ts +0 -33
  145. package/document-management/models/schemas.js +0 -34
  146. /package/orm/{server/data-types → data-types}/bytea.d.ts +0 -0
  147. /package/orm/{server/data-types → data-types}/bytea.js +0 -0
  148. /package/orm/{server/data-types → data-types}/index.d.ts +0 -0
  149. /package/orm/{server/data-types → data-types}/index.js +0 -0
  150. /package/orm/{server/data-types → data-types}/numeric-date.d.ts +0 -0
  151. /package/orm/{server/data-types → data-types}/timestamp.d.ts +0 -0
  152. /package/orm/{server/data-types → data-types}/timestamp.js +0 -0
@@ -3,7 +3,7 @@ import type { PgColumnBuilder, PgTableWithColumns } from 'drizzle-orm/pg-core';
3
3
  import type { CamelCase, ConditionalPick, SnakeCase } from 'type-fest';
4
4
  import type { JsonPath } from '../../json-path/json-path.js';
5
5
  import type { Record } from '../../schema/index.js';
6
- import type { AbstractConstructor, UnionToIntersection } from '../../types.js';
6
+ import type { UnionToIntersection } from '../../types.js';
7
7
  import type { Tagged } from '../../types/index.js';
8
8
  import type { OrmColumnReflectionData } from '../decorators.js';
9
9
  import type { EntityType } from '../entity.js';
@@ -23,11 +23,11 @@ export type ColumnDefinition = {
23
23
  export type TransformContext = {
24
24
  encryptionKey?: CryptoKey;
25
25
  };
26
- type Column<Name extends string, T> = null extends T ? ColumnBuilder<T, Name> : NotNull<ColumnBuilder<T, Name>>;
26
+ type Column<Name extends string, T> = null extends T ? ColumnBuilder<Exclude<T, null>, Name> : NotNull<ColumnBuilder<T, Name>>;
27
27
  export type ColumnPrefix<T> = T extends Tagged<unknown, EmbeddedConfigTag, {
28
28
  prefix: infer Prefix;
29
29
  }> ? Prefix extends string ? Prefix : '' : '';
30
- export type PgTableFromType<S extends string, T extends AbstractConstructor, TableName extends string = T extends Required<EntityType> ? SnakeCase<T['entityName']> : string> = PgTableWithColumns<{
30
+ export type PgTableFromType<T extends EntityType = EntityType, S extends string = string, TableName extends string = T extends Required<EntityType> ? SnakeCase<T['entityName']> : string> = PgTableWithColumns<{
31
31
  name: TableName;
32
32
  schema: S;
33
33
  columns: BuildColumns<TableName, {
package/orm/types.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  import type { $Type, HasDefault as DrizzleHasDefault, IsPrimaryKey as DrizzleIsPrimaryKey } from 'drizzle-orm';
2
- import type { boolean, date, doublePrecision, integer, jsonb, PgColumnBuilder, PgColumnBuilderBase, PgEnumColumnBuilderInitial, text, timestamp, uuid } from 'drizzle-orm/pg-core';
2
+ import type { boolean, doublePrecision, integer, jsonb, PgColumnBuilder, PgColumnBuilderBase, PgEnumColumnBuilderInitial, text, uuid } from 'drizzle-orm/pg-core';
3
3
  import { Array, Integer } from '../schema/index.js';
4
4
  import type { AbstractConstructor, EnumerationObject, EnumerationValue, ObjectLiteral, UnionToTuple } from '../types.js';
5
5
  import type { GetTagMetadata, HasTag, Tagged, UnwrapTagged } from '../types/index.js';
6
+ import type { bytea, numericDate, timestamp } from './data-types/index.js';
6
7
  import { Check, Column, Embedded, Encrypted, Index, PrimaryKey, References, Unique } from './decorators.js';
7
8
  import { Json, NumericDate, Timestamp, Uuid } from './schemas/index.js';
8
- import type { bytea } from './server/data-types/index.js';
9
9
  export type ColumnTypeTag = 'column';
10
10
  export type EmbeddedConfigTag = 'embedded';
11
11
  export type IsPrimaryKey<T> = T extends Tagged<unknown, ColumnTypeTag, PgColumnBuilderBase> ? Tagged<UnwrapTagged<T>, ColumnTypeTag, DrizzleIsPrimaryKey<GetTagMetadata<T, ColumnTypeTag>>> : Tagged<T, ColumnTypeTag, DrizzleIsPrimaryKey<ColumnBuilder<T>>>;
@@ -16,14 +16,14 @@ export type Embedded<T = AbstractConstructor, P extends string = ''> = Tagged<T,
16
16
  prefix: P;
17
17
  }>;
18
18
  export type Array<T extends Tagged<ObjectLiteral, ColumnTypeTag, PgColumnBuilder<any>>> = Tagged<UnwrapTagged<T>[], ColumnTypeTag, ReturnType<GetTagMetadata<T, ColumnTypeTag>['array']>>;
19
- export type Json<T extends ObjectLiteral = ObjectLiteral> = Tagged<T, ColumnTypeTag, $Type<ReturnType<typeof jsonb>, T>>;
19
+ export type Json<T> = Tagged<T, ColumnTypeTag, $Type<ReturnType<typeof jsonb>, T>>;
20
20
  export type Enum<T extends EnumerationObject> = Tagged<EnumerationValue<T>, ColumnTypeTag, EnumColumn<T>>;
21
21
  export type Text = Tagged<string, ColumnTypeTag, ReturnType<typeof text<string, [string, ...string[]]>>>;
22
22
  export type Uuid = Tagged<string, ColumnTypeTag, ReturnType<typeof uuid>>;
23
23
  export type Integer = Tagged<number, ColumnTypeTag, ReturnType<typeof integer>>;
24
24
  export type DoublePrecision = Tagged<number, ColumnTypeTag, ReturnType<typeof doublePrecision>>;
25
25
  export type Boolean = Tagged<number, ColumnTypeTag, ReturnType<typeof boolean>>;
26
- export type NumericDate = Tagged<number, ColumnTypeTag, ReturnType<typeof date>>;
26
+ export type NumericDate = Tagged<number, ColumnTypeTag, ReturnType<typeof numericDate>>;
27
27
  export type Timestamp = Tagged<number, ColumnTypeTag, ReturnType<typeof timestamp>>;
28
28
  export type Bytea = Tagged<Uint8Array, ColumnTypeTag, ReturnType<typeof bytea>>;
29
29
  export type Encrypted<T> = Tagged<T, ColumnTypeTag, ReturnType<typeof bytea>>;
package/orm/utils.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import type { Entity } from './entity.js';
2
+ export declare function getEntityMap<T extends Entity>(entities: T[]): Map<string, T>;
3
+ export declare function getEntityIds<T extends Entity>(entities: T[]): string[];
package/orm/utils.js ADDED
@@ -0,0 +1,6 @@
1
+ export function getEntityMap(entities) {
2
+ return new Map(entities.map((entity) => [entity.id, entity]));
3
+ }
4
+ export function getEntityIds(entities) {
5
+ return entities.map((entity) => entity.id);
6
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tstdl/base",
3
- "version": "0.92.85",
3
+ "version": "0.92.87",
4
4
  "author": "Patrick Hein",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -17,14 +17,16 @@
17
17
  "pub": "npm run build:production && rm -vf dist/test* && rm -vrf dist/tools/ && npm publish dist/",
18
18
  "tsc:watch": "tsc --watch",
19
19
  "tsc-alias:watch": "tsc-alias --watch",
20
- "generate:orm": "npm run generate:drizzle:document-management && npm run generate:drizzle:authentication && npm run generate:drizzle:mail",
21
- "generate:drizzle:document-management": "drizzle-kit generate --config dist/document-management/server/drizzle.config.js",
22
- "generate:drizzle:authentication": "drizzle-kit generate --config dist/authentication/server/drizzle.config.js",
23
- "generate:drizzle:mail": "drizzle-kit generate --config dist/mail/drizzle.config.js",
24
- "copy:orm": "npm run copy:document-management && npm run copy:authentication && npm run copy:mail",
25
- "copy:document-management": "rm -rf ./dist/document-management/server/drizzle && cp -r ./source/document-management/server/drizzle ./dist/document-management/server/",
26
- "copy:authentication": "rm -rf ./dist/authentication/server/drizzle && cp -r ./source/authentication/server/drizzle ./dist/authentication/server/",
27
- "copy:mail": "rm -rf ./dist/mail/drizzle && cp -r ./source/mail/drizzle ./dist/mail/"
20
+ "generate:migration": "npm run generate:migration:document-management && npm run generate:migration:authentication && npm run generate:migration:mail && npm run generate:migration:queue",
21
+ "generate:migration:document-management": "drizzle-kit generate --config dist/document-management/server/drizzle.config.js",
22
+ "generate:migration:authentication": "drizzle-kit generate --config dist/authentication/server/drizzle.config.js",
23
+ "generate:migration:mail": "drizzle-kit generate --config dist/mail/drizzle.config.js",
24
+ "generate:migration:queue": "drizzle-kit generate --config dist/queue/postgres/drizzle.config.js",
25
+ "copy:orm": "npm run copy:orm:document-management && npm run copy:orm:authentication && npm run copy:orm:mail && npm run copy:orm:queue",
26
+ "copy:orm:document-management": "rm -rf ./dist/document-management/server/drizzle && cp -r ./source/document-management/server/drizzle ./dist/document-management/server/",
27
+ "copy:orm:authentication": "rm -rf ./dist/authentication/server/drizzle && cp -r ./source/authentication/server/drizzle ./dist/authentication/server/",
28
+ "copy:orm:mail": "rm -rf ./dist/mail/drizzle && cp -r ./source/mail/drizzle ./dist/mail/",
29
+ "copy:orm:queue": "rm -rf ./dist/queue/postgres/drizzle && cp -r ./source/queue/postgres/drizzle ./dist/queue/postgres/"
28
30
  },
29
31
  "exports": {
30
32
  "./tsconfig.json": "./tsconfig.json",
@@ -127,16 +129,18 @@
127
129
  "./utils/string": "./utils/string/index.js"
128
130
  },
129
131
  "dependencies": {
130
- "@google-cloud/storage": "7.15",
131
- "@google-cloud/vertexai": "1.9",
132
- "disposablestack": "1.1",
132
+ "@google-cloud/storage": "^7.15",
133
+ "@google-cloud/vertexai": "^1.9",
134
+ "disposablestack": "^1.1",
133
135
  "luxon": "^3.5",
134
136
  "reflect-metadata": "^0.2",
135
137
  "rxjs": "^7.8",
136
- "type-fest": "4.35"
138
+ "ts-pattern": "^5.6",
139
+ "type-fest": "^4.37"
137
140
  },
138
141
  "devDependencies": {
139
- "@stylistic/eslint-plugin": "4.1",
142
+ "@biomejs/biome": "1.9",
143
+ "@stylistic/eslint-plugin": "4.2",
140
144
  "@types/chroma-js": "2.4",
141
145
  "@types/koa__router": "12.0",
142
146
  "@types/luxon": "3.4",
@@ -145,17 +149,17 @@
145
149
  "@types/node": "22",
146
150
  "@types/nodemailer": "6.4",
147
151
  "@types/pg": "8.11",
148
- "@typescript-eslint/eslint-plugin": "8.25",
152
+ "@typescript-eslint/eslint-plugin": "8.26",
149
153
  "concurrently": "9.1",
150
154
  "drizzle-kit": "0.30",
151
155
  "eslint": "9.21",
152
156
  "globals": "16.0",
153
157
  "tsc-alias": "1.8",
154
- "typescript": "5.7"
158
+ "typescript": "5.8"
155
159
  },
156
160
  "peerDependencies": {
157
161
  "@elastic/elasticsearch": "^8.17",
158
- "@google/generative-ai": "^0.22",
162
+ "@google/generative-ai": "^0.23",
159
163
  "@tstdl/angular": "^0.92",
160
164
  "@zxcvbn-ts/core": "^3.0",
161
165
  "@zxcvbn-ts/language-common": "^3.0",
@@ -166,13 +170,13 @@
166
170
  "handlebars": "^4.7",
167
171
  "minio": "^8.0",
168
172
  "mjml": "^4.15",
169
- "mongodb": "^6.13",
173
+ "mongodb": "^6.14",
170
174
  "nodemailer": "^6.10",
171
175
  "pg": "^8.13",
172
176
  "playwright": "^1.50",
173
177
  "preact": "^10.26",
174
178
  "preact-render-to-string": "^6.5",
175
- "undici": "^7.3",
179
+ "undici": "^7.4",
176
180
  "urlpattern-polyfill": "^10.0"
177
181
  },
178
182
  "peerDependenciesMeta": {
@@ -92,7 +92,6 @@ export declare class PdfService implements Resolvable<PdfServiceArgument> {
92
92
  * @returns pdf bytes
93
93
  */
94
94
  renderTemplate(keyOrTemplate: string | PdfTemplate, templateContext?: object, options?: PdfServiceRenderOptions): Promise<Uint8Array>;
95
- merge(pdfs: (string | Uint8Array)[]): Promise<Uint8Array>;
96
95
  private renderStream;
97
96
  }
98
97
  export declare function pdfTemplate(name: string, fields: {
@@ -12,62 +12,6 @@ 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 __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, inner;
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
- if (async) inner = dispose;
27
- }
28
- if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
29
- if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
30
- env.stack.push({ value: value, dispose: dispose, async: async });
31
- }
32
- else if (async) {
33
- env.stack.push({ async: true });
34
- }
35
- return value;
36
- };
37
- var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
38
- return function (env) {
39
- function fail(e) {
40
- env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
41
- env.hasError = true;
42
- }
43
- var r, s = 0;
44
- function next() {
45
- while (r = env.stack.pop()) {
46
- try {
47
- if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
48
- if (r.dispose) {
49
- var result = r.dispose.call(r.value);
50
- if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
51
- }
52
- else s |= 1;
53
- }
54
- catch (e) {
55
- fail(e);
56
- }
57
- }
58
- if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
59
- if (env.hasError) throw env.error;
60
- }
61
- return next();
62
- };
63
- })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
64
- var e = new Error(message);
65
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
66
- });
67
- import { execFile as execFileCallback } from 'node:child_process';
68
- import { access, readFile, unlink, writeFile } from 'node:fs/promises';
69
- import { tmpdir } from 'node:os';
70
- import { promisify } from 'node:util';
71
15
  import { BrowserContextController } from '../browser/browser-context-controller.js';
72
16
  import { BrowserController } from '../browser/browser-controller.js';
73
17
  import { PdfRenderOptions } from '../browser/pdf-options.js';
@@ -80,8 +24,7 @@ import { finalizeStream } from '../utils/stream/finalize-stream.js';
80
24
  import { readableStreamFromPromise } from '../utils/stream/readable-stream-from-promise.js';
81
25
  import { readBinaryStream } from '../utils/stream/stream-reader.js';
82
26
  import { timeout } from '../utils/timing.js';
83
- import { isDefined, isString } from '../utils/type-guards.js';
84
- const execFile = promisify(execFileCallback);
27
+ import { isDefined } from '../utils/type-guards.js';
85
28
  export class PdfServiceRenderOptions extends PdfRenderOptions {
86
29
  browserContext;
87
30
  locale;
@@ -196,43 +139,6 @@ let PdfService = class PdfService {
196
139
  const stream = this.renderTemplateStream(keyOrTemplate, templateContext, options);
197
140
  return readBinaryStream(stream);
198
141
  }
199
- async merge(pdfs) {
200
- const env_1 = { stack: [], error: void 0, hasError: false };
201
- try {
202
- const stack = __addDisposableResource(env_1, new AsyncDisposableStack(), true);
203
- const tmp = tmpdir();
204
- const sourceFiles = await Promise.all(pdfs.map(async (pdf) => {
205
- if (isString(pdf)) {
206
- return pdf;
207
- }
208
- const file = `${tmp}/${crypto.randomUUID()}.pdf`;
209
- await writeFile(file, pdf);
210
- stack.defer(async () => unlink(file));
211
- return file;
212
- }));
213
- const resultFile = `${tmp}/${crypto.randomUUID()}.pdf`;
214
- const resultPromise = execFile('pdfunite', [...sourceFiles, resultFile]);
215
- const result = await resultPromise;
216
- try {
217
- await access(resultFile);
218
- stack.defer(async () => unlink(resultFile));
219
- }
220
- catch { /* ignore */ }
221
- if (resultPromise.child.exitCode != 0) {
222
- throw new Error(result.stderr);
223
- }
224
- return readFile(resultFile);
225
- }
226
- catch (e_1) {
227
- env_1.error = e_1;
228
- env_1.hasError = true;
229
- }
230
- finally {
231
- const result_1 = __disposeResources(env_1);
232
- if (result_1)
233
- await result_1;
234
- }
235
- }
236
142
  renderStream(handler, options = {}) {
237
143
  return readableStreamFromPromise(async () => {
238
144
  const context = options.browserContext ?? await this.browserController.newContext({ locale: options.locale ?? this.defaultLocale });
package/pdf/utils.d.ts CHANGED
@@ -1 +1,3 @@
1
- export declare function getPdfPageCount(file: string): Promise<number>;
1
+ export declare function getPdfPageCount(file: string | Uint8Array | ReadableStream<Uint8Array>): Promise<number>;
2
+ export declare function mergePdfs(pdfs: (string | Uint8Array | ReadableStream<Uint8Array>)[]): Promise<Uint8Array>;
3
+ export declare function mergePdfsStream(pdfs: (string | Uint8Array | ReadableStream<Uint8Array>)[]): Promise<ReadableStream<Uint8Array>>;
package/pdf/utils.js CHANGED
@@ -1,11 +1,136 @@
1
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
16
+ env.stack.push({ value: value, dispose: dispose, async: async });
17
+ }
18
+ else if (async) {
19
+ env.stack.push({ async: true });
20
+ }
21
+ return value;
22
+ };
23
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
24
+ return function (env) {
25
+ function fail(e) {
26
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
27
+ env.hasError = true;
28
+ }
29
+ var r, s = 0;
30
+ function next() {
31
+ while (r = env.stack.pop()) {
32
+ try {
33
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
34
+ if (r.dispose) {
35
+ var result = r.dispose.call(r.value);
36
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
37
+ }
38
+ else s |= 1;
39
+ }
40
+ catch (e) {
41
+ fail(e);
42
+ }
43
+ }
44
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
45
+ if (env.hasError) throw env.error;
46
+ }
47
+ return next();
48
+ };
49
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
50
+ var e = new Error(message);
51
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
+ });
53
+ import { TemporaryFile } from '../file/temporary-file.js';
1
54
  import { spawnCommand } from '../process/spawn.js';
55
+ import { isString } from '../utils/type-guards.js';
2
56
  export async function getPdfPageCount(file) {
3
- const process = await spawnCommand('qpdf', ['--show-npages', file]);
57
+ const env_1 = { stack: [], error: void 0, hasError: false };
58
+ try {
59
+ const fileIsPath = isString(file);
60
+ const tmpFile = __addDisposableResource(env_1, fileIsPath ? await TemporaryFile.from(file) : undefined, true);
61
+ const path = fileIsPath ? file : tmpFile.path;
62
+ const process = await spawnCommand('qpdf', ['--show-npages', path]);
63
+ const { code } = await process.wait();
64
+ if (code != 0) {
65
+ const errorOutput = await process.readError();
66
+ throw new Error(errorOutput.trim());
67
+ }
68
+ const output = await process.readOutput();
69
+ return Number(output);
70
+ }
71
+ catch (e_1) {
72
+ env_1.error = e_1;
73
+ env_1.hasError = true;
74
+ }
75
+ finally {
76
+ const result_1 = __disposeResources(env_1);
77
+ if (result_1)
78
+ await result_1;
79
+ }
80
+ }
81
+ export async function mergePdfs(pdfs) {
82
+ const env_2 = { stack: [], error: void 0, hasError: false };
83
+ try {
84
+ const stack = __addDisposableResource(env_2, new AsyncDisposableStack(), true);
85
+ const resultFile = __addDisposableResource(env_2, TemporaryFile.create(), true);
86
+ const sourceFiles = await getPdfSourceFiles(pdfs, stack);
87
+ await pdfunite(sourceFiles, resultFile);
88
+ return await resultFile.read();
89
+ }
90
+ catch (e_2) {
91
+ env_2.error = e_2;
92
+ env_2.hasError = true;
93
+ }
94
+ finally {
95
+ const result_2 = __disposeResources(env_2);
96
+ if (result_2)
97
+ await result_2;
98
+ }
99
+ }
100
+ export async function mergePdfsStream(pdfs) {
101
+ const env_3 = { stack: [], error: void 0, hasError: false };
102
+ try {
103
+ const stack = __addDisposableResource(env_3, new AsyncDisposableStack(), true);
104
+ const resultFile = __addDisposableResource(env_3, TemporaryFile.create(), true);
105
+ const sourceFiles = await getPdfSourceFiles(pdfs, stack);
106
+ await pdfunite(sourceFiles, resultFile);
107
+ return resultFile.readStream();
108
+ }
109
+ catch (e_3) {
110
+ env_3.error = e_3;
111
+ env_3.hasError = true;
112
+ }
113
+ finally {
114
+ const result_3 = __disposeResources(env_3);
115
+ if (result_3)
116
+ await result_3;
117
+ }
118
+ }
119
+ async function getPdfSourceFiles(pdfs, stack) {
120
+ return await Promise.all(pdfs.map(async (pdf) => {
121
+ if (isString(pdf)) {
122
+ return pdf;
123
+ }
124
+ const tmpFile = await TemporaryFile.from(pdf);
125
+ stack.use(tmpFile);
126
+ return tmpFile.path;
127
+ }));
128
+ }
129
+ async function pdfunite(sourceFiles, resultFile) {
130
+ const process = await spawnCommand('pdfunite', [...sourceFiles, resultFile.path]);
4
131
  const { code } = await process.wait();
5
132
  if (code != 0) {
6
133
  const errorOutput = await process.readError();
7
- throw new Error(errorOutput.trim());
134
+ throw new Error(errorOutput);
8
135
  }
9
- const output = await process.readOutput();
10
- return Number(output);
11
136
  }
@@ -4,8 +4,8 @@ export declare class LazyPromise<T> extends CustomPromise<T> {
4
4
  #private;
5
5
  readonly [Symbol.toStringTag] = "LazyPromise";
6
6
  constructor(executorOrPromiseProvider: PromiseExecutor<T> | (() => PromiseLike<T>));
7
- then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null | undefined, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined): Promise<TResult1 | TResult2>;
8
- catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<T | TResult>;
9
- finally(onfinally?: (() => void) | null | undefined): Promise<T>;
7
+ then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null): Promise<TResult1 | TResult2>;
8
+ catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null): Promise<T | TResult>;
9
+ finally(onfinally?: (() => void) | null): Promise<T>;
10
10
  private execute;
11
11
  }
@@ -13,4 +13,5 @@ export declare class QueueEnqueueBatch<T> implements QueueEnqueueBatchMethods<T>
13
13
  /** enqueues all added items */
14
14
  enqueue(returnJobs?: false): Promise<void>;
15
15
  enqueue(returnJobs: true): Promise<Job<T>[]>;
16
+ enqueue(returnJobs?: boolean): Promise<Job<T>[] | undefined>;
16
17
  }
@@ -13,7 +13,7 @@ export class QueueEnqueueBatch {
13
13
  async enqueue(returnJobs) {
14
14
  const items = this.items;
15
15
  this.items = [];
16
- const result = await this.queue.enqueueMany(items, returnJobs);
16
+ const result = await this.queue.enqueueMany(items, { returnJobs });
17
17
  return result;
18
18
  }
19
19
  }
@@ -1,7 +1,7 @@
1
1
  import type { CancellationSignal } from '../../cancellation/index.js';
2
2
  import { Lock } from '../../lock/index.js';
3
3
  import { MessageBusProvider } from '../../message-bus/index.js';
4
- import type { EnqueueManyItem, EnqueueOptions, Job, JobTag } from '../../queue/index.js';
4
+ import type { EnqueueManyItem, EnqueueManyOptions, EnqueueOneOptions, Job, JobTag } from '../../queue/index.js';
5
5
  import { Queue, type QueueConfig } from '../../queue/index.js';
6
6
  import { MongoJobRepository } from './mongo-job.repository.js';
7
7
  export declare class MongoQueue<T = unknown> extends Queue<T> {
@@ -12,9 +12,14 @@ export declare class MongoQueue<T = unknown> extends Queue<T> {
12
12
  private readonly maxTries;
13
13
  private readonly messageBus;
14
14
  constructor(repository: MongoJobRepository<T>, lock: Lock, messageBusProvider: MessageBusProvider, key: string, config?: QueueConfig);
15
- enqueue(data: T, options?: EnqueueOptions): Promise<Job<T>>;
16
- enqueueMany(items: EnqueueManyItem<T>[], returnJobs?: false): Promise<void>;
17
- enqueueMany(items: EnqueueManyItem<T>[], returnJobs: true): Promise<Job<T>[]>;
15
+ enqueue(data: T, options?: EnqueueOneOptions): Promise<Job<T>>;
16
+ enqueueMany(items: EnqueueManyItem<T>[], options?: EnqueueManyOptions & {
17
+ returnJobs?: false;
18
+ }): Promise<void>;
19
+ enqueueMany(items: EnqueueManyItem<T>[], options: EnqueueManyOptions & {
20
+ returnJobs: true;
21
+ }): Promise<Job<T>[]>;
22
+ enqueueMany(items: EnqueueManyItem<T>[], options?: EnqueueManyOptions): Promise<void | Job<T>[]>;
18
23
  has(id: string): Promise<boolean>;
19
24
  countByTag(tag: JobTag): Promise<number>;
20
25
  get(id: string): Promise<Job<T> | undefined>;
@@ -66,12 +66,12 @@ let MongoQueue = class MongoQueue extends Queue {
66
66
  : await this.repository.insertWithUniqueTagStrategy(newJob, uniqueTag);
67
67
  return toModelJob(job);
68
68
  }
69
- async enqueueMany(items, returnJobs = false) {
69
+ async enqueueMany(items, options) {
70
70
  const now = currentTimestamp();
71
71
  const nonUnique = [];
72
72
  const keepOld = [];
73
73
  const takeNew = [];
74
- for (const { data, tag = null, uniqueTag, priority = defaultJobPriority } of items) {
74
+ for (const { data, tag = null, priority = defaultJobPriority } of items) {
75
75
  const newMongoJob = {
76
76
  queue: this.queueKey,
77
77
  jobId: getNewId(),
@@ -83,7 +83,7 @@ let MongoQueue = class MongoQueue extends Queue {
83
83
  lastDequeueTimestamp: 0,
84
84
  batch: null
85
85
  };
86
- switch (uniqueTag) {
86
+ switch (options?.uniqueTag) {
87
87
  case undefined:
88
88
  nonUnique.push(newMongoJob);
89
89
  break;
@@ -102,7 +102,7 @@ let MongoQueue = class MongoQueue extends Queue {
102
102
  (keepOld.length > 0) ? this.repository.bulkInsertWithUniqueTagStrategy(keepOld, UniqueTagStrategy.KeepOld) : undefined,
103
103
  (takeNew.length > 0) ? this.repository.bulkInsertWithUniqueTagStrategy(takeNew, UniqueTagStrategy.TakeNew) : undefined
104
104
  ]);
105
- if (returnJobs) {
105
+ if (options?.returnJobs == true) {
106
106
  const keepOldTags = keepOld.map((job) => job.tag);
107
107
  const takeNewTags = takeNew.map((job) => job.tag);
108
108
  const uniqueTagJobs = await this.repository.loadManyByFilter({ queue: this.queueKey, tag: { $in: [...keepOldTags, ...takeNewTags] } });
@@ -225,7 +225,7 @@ MongoQueue = __decorate([
225
225
  if (isString(argument)) {
226
226
  return provider.get(argument, defaultQueueConfig);
227
227
  }
228
- return provider.get(argument.key, { ...defaultQueueConfig, ...argument });
228
+ return provider.get(argument.name, { ...defaultQueueConfig, ...argument });
229
229
  }
230
230
  }
231
231
  }),
@@ -241,7 +241,6 @@ function toModelJob(mongoJob) {
241
241
  };
242
242
  return job;
243
243
  }
244
- // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
245
244
  function getDequeueFindParameters(queueKey, maxTries, processTimeout, batch = null) {
246
245
  const now = currentTimestamp();
247
246
  const maximumLastDequeueTimestamp = now - processTimeout;
@@ -0,0 +1,11 @@
1
+ CREATE TABLE "queue"."job" (
2
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
3
+ "queue" text NOT NULL,
4
+ "tag" text,
5
+ "priority" integer NOT NULL,
6
+ "enqueue_timestamp" timestamp with time zone NOT NULL,
7
+ "tries" integer NOT NULL,
8
+ "last_dequeue_timestamp" timestamp with time zone,
9
+ "data" jsonb NOT NULL,
10
+ CONSTRAINT "job_queue_tag_unique" UNIQUE("queue","tag")
11
+ );
@@ -0,0 +1,90 @@
1
+ {
2
+ "id": "1a2e63a5-b780-4f4d-ae41-ce8369aa1cf0",
3
+ "prevId": "00000000-0000-0000-0000-000000000000",
4
+ "version": "7",
5
+ "dialect": "postgresql",
6
+ "tables": {
7
+ "queue.job": {
8
+ "name": "job",
9
+ "schema": "queue",
10
+ "columns": {
11
+ "id": {
12
+ "name": "id",
13
+ "type": "uuid",
14
+ "primaryKey": true,
15
+ "notNull": true,
16
+ "default": "gen_random_uuid()"
17
+ },
18
+ "queue": {
19
+ "name": "queue",
20
+ "type": "text",
21
+ "primaryKey": false,
22
+ "notNull": true
23
+ },
24
+ "tag": {
25
+ "name": "tag",
26
+ "type": "text",
27
+ "primaryKey": false,
28
+ "notNull": false
29
+ },
30
+ "priority": {
31
+ "name": "priority",
32
+ "type": "integer",
33
+ "primaryKey": false,
34
+ "notNull": true
35
+ },
36
+ "enqueue_timestamp": {
37
+ "name": "enqueue_timestamp",
38
+ "type": "timestamp with time zone",
39
+ "primaryKey": false,
40
+ "notNull": true
41
+ },
42
+ "tries": {
43
+ "name": "tries",
44
+ "type": "integer",
45
+ "primaryKey": false,
46
+ "notNull": true
47
+ },
48
+ "last_dequeue_timestamp": {
49
+ "name": "last_dequeue_timestamp",
50
+ "type": "timestamp with time zone",
51
+ "primaryKey": false,
52
+ "notNull": false
53
+ },
54
+ "data": {
55
+ "name": "data",
56
+ "type": "jsonb",
57
+ "primaryKey": false,
58
+ "notNull": true
59
+ }
60
+ },
61
+ "indexes": {},
62
+ "foreignKeys": {},
63
+ "compositePrimaryKeys": {},
64
+ "uniqueConstraints": {
65
+ "job_queue_tag_unique": {
66
+ "name": "job_queue_tag_unique",
67
+ "nullsNotDistinct": false,
68
+ "columns": [
69
+ "queue",
70
+ "tag"
71
+ ]
72
+ }
73
+ },
74
+ "policies": {},
75
+ "checkConstraints": {},
76
+ "isRLSEnabled": false
77
+ }
78
+ },
79
+ "enums": {},
80
+ "schemas": {},
81
+ "sequences": {},
82
+ "roles": {},
83
+ "policies": {},
84
+ "views": {},
85
+ "_meta": {
86
+ "columns": {},
87
+ "schemas": {},
88
+ "tables": {}
89
+ }
90
+ }