@tstdl/base 0.92.155 → 0.92.156

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 (34) hide show
  1. package/ai/ai-file.service.js +1 -1
  2. package/api/server/gateway.d.ts +1 -3
  3. package/api/server/gateway.js +15 -21
  4. package/authentication/authentication.api.d.ts +36 -3
  5. package/authentication/authentication.api.js +12 -1
  6. package/authentication/client/authentication.service.js +1 -1
  7. package/authentication/server/authentication.api-controller.d.ts +2 -2
  8. package/authentication/server/authentication.api-controller.js +6 -8
  9. package/authentication/server/authentication.service.d.ts +31 -2
  10. package/authentication/server/authentication.service.js +43 -3
  11. package/browser/browser.service.d.ts +0 -1
  12. package/browser/browser.service.js +7 -19
  13. package/document-management/server/services/document-management-ai.service.js +2 -2
  14. package/document-management/server/services/document-property.service.js +3 -3
  15. package/document-management/server/validators/ai-validation-executor.js +1 -1
  16. package/document-management/service-models/enriched/enriched-document.view.d.ts +2 -0
  17. package/document-management/service-models/enriched/enriched-document.view.js +8 -0
  18. package/message-bus/broadcast-channel/broadcast-channel-message-bus-provider.d.ts +0 -2
  19. package/message-bus/broadcast-channel/broadcast-channel-message-bus-provider.js +6 -16
  20. package/message-bus/local/local-message-bus-provider.d.ts +0 -2
  21. package/message-bus/local/local-message-bus-provider.js +7 -19
  22. package/package.json +4 -4
  23. package/queue/mongo/mongo-job.repository.js +2 -2
  24. package/queue/mongo/queue.provider.d.ts +1 -5
  25. package/queue/mongo/queue.provider.js +5 -22
  26. package/templates/module.js +1 -1
  27. package/templates/template-renderer.provider.d.ts +0 -1
  28. package/templates/template-renderer.provider.js +3 -15
  29. package/templates/template-resolver.provider.d.ts +0 -1
  30. package/templates/template-resolver.provider.js +3 -15
  31. package/templates/template.service.d.ts +0 -4
  32. package/templates/template.service.js +6 -20
  33. package/text/localization.service.d.ts +0 -2
  34. package/text/localization.service.js +7 -16
@@ -164,7 +164,7 @@ let AiFileService = class AiFileService {
164
164
  contentType = blob.type;
165
165
  size = blob.size;
166
166
  }
167
- this.#logger.verbose(`Uploading file "${id}" (${formatBytes(size)}) via GenAI API...`);
167
+ this.#logger.verbose(`Uploading file "${id}" (${formatBytes(size)})...`);
168
168
  // upload supports paths and blobs, but not streams (yet)
169
169
  const response = await this.#genAI.files.upload({ file: uploadData, config: { mimeType: contentType } });
170
170
  return {
@@ -2,11 +2,9 @@ import 'urlpattern-polyfill';
2
2
  import type { HttpServerRequestContext } from '../../http/server/http-server.js';
3
3
  import { HttpServerResponse, type HttpServerRequest } from '../../http/server/index.js';
4
4
  import { resolveArgumentType, type Resolvable } from '../../injector/index.js';
5
- import { Logger } from '../../logger/index.js';
6
5
  import type { Type } from '../../types/index.js';
7
6
  import { type AsyncMiddleware, type AsyncMiddlewareNext } from '../../utils/middleware.js';
8
7
  import { type ApiController, type ApiDefinition, type ApiEndpointDefinition, type ApiEndpointMethod, type ApiEndpointServerImplementation } from '../types.js';
9
- import { ApiRequestTokenProvider } from './api-request-token.provider.js';
10
8
  import type { CorsMiddlewareOptions } from './middlewares/cors.middleware.js';
11
9
  export type ApiGatewayMiddlewareContext = {
12
10
  readonly api: ApiItem;
@@ -62,7 +60,7 @@ export declare class ApiGateway implements Resolvable<ApiGatewayOptions> {
62
60
  private readonly options;
63
61
  private composedMiddleware;
64
62
  readonly [resolveArgumentType]: ApiGatewayOptions;
65
- constructor(requestTokenProvider: ApiRequestTokenProvider, logger: Logger, options?: ApiGatewayOptions);
63
+ constructor();
66
64
  addMiddleware(middleware: ApiGatewayMiddleware): void;
67
65
  supressErrors(...errorTypes: Type<Error>[]): void;
68
66
  registerApi<T extends ApiDefinition>(definition: ApiDefinition, implementation: ApiController<T>): void;
@@ -7,18 +7,17 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
- var __param = (this && this.__param) || function (paramIndex, decorator) {
11
- return function (target, key) { decorator(target, key, paramIndex); }
12
- };
10
+ var ApiGateway_1;
13
11
  import 'urlpattern-polyfill';
14
12
  import { BadRequestError } from '../../errors/bad-request.error.js';
15
13
  import { NotFoundError } from '../../errors/not-found.error.js';
16
14
  import { NotImplementedError } from '../../errors/not-implemented.error.js';
17
15
  import { HttpServerResponse } from '../../http/server/index.js';
18
- import { InjectArg, ResolveArg, Singleton, resolveArgumentType } from '../../injector/index.js';
16
+ import { Singleton, inject, injectArgument, resolveArgumentType } from '../../injector/index.js';
19
17
  import { Logger } from '../../logger/index.js';
20
18
  import { Schema } from '../../schema/index.js';
21
19
  import { DataStreamSource } from '../../sse/data-stream-source.js';
20
+ import { DataStream } from '../../sse/data-stream.js';
22
21
  import { ServerSentEventsSource } from '../../sse/server-sent-events-source.js';
23
22
  import { toArray } from '../../utils/array/array.js';
24
23
  import { composeAsyncMiddleware } from '../../utils/middleware.js';
@@ -51,25 +50,22 @@ export class ApiGatewayOptions {
51
50
  */
52
51
  defaultMaxBytes;
53
52
  }
54
- let ApiGateway = class ApiGateway {
55
- requestTokenProvider;
56
- logger;
53
+ let ApiGateway = ApiGateway_1 = class ApiGateway {
54
+ requestTokenProvider = inject(ApiRequestTokenProvider);
55
+ logger = inject(Logger, ApiGateway_1.name);
57
56
  prefix;
58
57
  apis;
59
58
  middlewares;
60
59
  supressedErrors;
61
60
  catchErrorMiddleware;
62
- options;
61
+ options = injectArgument(this, { optional: true }) ?? {};
63
62
  composedMiddleware;
64
- constructor(requestTokenProvider, logger, options = {}) {
65
- this.requestTokenProvider = requestTokenProvider;
66
- this.logger = logger;
67
- this.options = options;
68
- this.prefix = isNull(options.prefix) ? null : (options.prefix ?? 'api');
63
+ constructor() {
64
+ this.prefix = isNull(this.options.prefix) ? null : (this.options.prefix ?? 'api');
69
65
  this.apis = new Map();
70
- this.middlewares = options.middlewares ?? [];
71
- this.supressedErrors = new Set(options.supressedErrors);
72
- this.catchErrorMiddleware = getCatchErrorMiddleware(this.supressedErrors, logger);
66
+ this.middlewares = this.options.middlewares ?? [];
67
+ this.supressedErrors = new Set(this.options.supressedErrors);
68
+ this.catchErrorMiddleware = getCatchErrorMiddleware(this.supressedErrors, this.logger);
73
69
  this.updateMiddleware();
74
70
  }
75
71
  addMiddleware(middleware) {
@@ -193,20 +189,18 @@ let ApiGateway = class ApiGateway {
193
189
  : isBlob(result) ? { stream: result.stream() }
194
190
  : isReadableStream(result) ? { stream: result }
195
191
  : (result instanceof ServerSentEventsSource) ? { events: result }
196
- : (result instanceof DataStreamSource) ? { events: result.eventSource }
192
+ : (context.endpoint.definition.result == DataStream) ? { events: DataStreamSource.fromIterable(result).eventSource }
197
193
  : (context.endpoint.definition.result == String) ? { text: result }
198
194
  : { json: result };
199
195
  }
200
196
  await next();
201
197
  }
202
198
  };
203
- ApiGateway = __decorate([
199
+ ApiGateway = ApiGateway_1 = __decorate([
204
200
  Singleton({
205
201
  defaultArgumentProvider: (context) => context.resolve(API_MODULE_OPTIONS).gatewayOptions,
206
202
  }),
207
- __param(1, ResolveArg('ApiGateway')),
208
- __param(2, InjectArg()),
209
- __metadata("design:paramtypes", [ApiRequestTokenProvider, Logger, ApiGatewayOptions])
203
+ __metadata("design:paramtypes", [])
210
204
  ], ApiGateway);
211
205
  export { ApiGateway };
212
206
  async function getBody(request, options, schema) {
@@ -23,7 +23,7 @@ export type AuthenticationApiDefinition<AdditionalTokenPayload extends Record =
23
23
  export declare const authenticationApiDefinition: {
24
24
  resource: string;
25
25
  endpoints: {
26
- getToken: {
26
+ login: {
27
27
  resource: string;
28
28
  method: "POST";
29
29
  parameters: ObjectSchema<{
@@ -83,6 +83,17 @@ export declare const authenticationApiDefinition: {
83
83
  [dontWaitForValidToken]: boolean;
84
84
  };
85
85
  };
86
+ changeSecret: {
87
+ resource: string;
88
+ method: "POST";
89
+ parameters: ObjectSchema<{
90
+ readonly subject: string;
91
+ readonly currentSecret: string;
92
+ readonly newSecret: string;
93
+ }>;
94
+ result: import("../schema/index.js").LiteralSchema<"ok">;
95
+ credentials: true;
96
+ };
86
97
  initSecretReset: {
87
98
  resource: string;
88
99
  method: "POST";
@@ -131,7 +142,7 @@ export declare const authenticationApiDefinition: {
131
142
  export declare function getAuthenticationApiDefinition<AdditionalTokenPayload extends Record, AuthenticationData, AdditionalInitSecretResetData, AdditionalEndpoints extends ApiEndpointsDefinition>(additionalTokenPayloadSchema: ObjectSchemaOrType<AdditionalTokenPayload>, authenticationDataSchema: SchemaTestable<AuthenticationData>, initSecretResetDataSchema: SchemaTestable<AdditionalInitSecretResetData>, resource?: string, additionalEndpoints?: AdditionalEndpoints): {
132
143
  resource: string;
133
144
  endpoints: {
134
- getToken: {
145
+ login: {
135
146
  resource: string;
136
147
  method: "POST";
137
148
  parameters: ObjectSchema<{
@@ -191,6 +202,17 @@ export declare function getAuthenticationApiDefinition<AdditionalTokenPayload ex
191
202
  [dontWaitForValidToken]: boolean;
192
203
  };
193
204
  };
205
+ changeSecret: {
206
+ resource: string;
207
+ method: "POST";
208
+ parameters: ObjectSchema<{
209
+ readonly subject: string;
210
+ readonly currentSecret: string;
211
+ readonly newSecret: string;
212
+ }>;
213
+ result: import("../schema/index.js").LiteralSchema<"ok">;
214
+ credentials: true;
215
+ };
194
216
  initSecretReset: {
195
217
  resource: string;
196
218
  method: "POST";
@@ -234,7 +256,7 @@ export declare function getAuthenticationApiDefinition<AdditionalTokenPayload ex
234
256
  * @template AdditionalInitSecretResetData Type of additional secret reset data
235
257
  */
236
258
  export declare function getAuthenticationApiEndpointsDefinition<AdditionalTokenPayload extends Record, AuthenticationData, AdditionalInitSecretResetData>(additionalTokenPayloadSchema: ObjectSchemaOrType<AdditionalTokenPayload>, authenticationDataSchema: SchemaTestable<AuthenticationData>, additionalInitSecretResetDataSchema: SchemaTestable<AdditionalInitSecretResetData>): {
237
- getToken: {
259
+ login: {
238
260
  resource: string;
239
261
  method: "POST";
240
262
  parameters: ObjectSchema<{
@@ -294,6 +316,17 @@ export declare function getAuthenticationApiEndpointsDefinition<AdditionalTokenP
294
316
  [dontWaitForValidToken]: boolean;
295
317
  };
296
318
  };
319
+ changeSecret: {
320
+ resource: string;
321
+ method: "POST";
322
+ parameters: ObjectSchema<{
323
+ readonly subject: string;
324
+ readonly currentSecret: string;
325
+ readonly newSecret: string;
326
+ }>;
327
+ result: import("../schema/index.js").LiteralSchema<"ok">;
328
+ credentials: true;
329
+ };
297
330
  initSecretReset: {
298
331
  resource: string;
299
332
  method: "POST";
@@ -44,7 +44,7 @@ export function getAuthenticationApiDefinition(additionalTokenPayloadSchema, aut
44
44
  export function getAuthenticationApiEndpointsDefinition(additionalTokenPayloadSchema, authenticationDataSchema, additionalInitSecretResetDataSchema) {
45
45
  const tokenResultSchema = assign(TokenPayloadBase, additionalTokenPayloadSchema);
46
46
  return {
47
- getToken: {
47
+ login: {
48
48
  resource: 'token',
49
49
  method: 'POST',
50
50
  parameters: explicitObject({
@@ -104,6 +104,17 @@ export function getAuthenticationApiEndpointsDefinition(additionalTokenPayloadSc
104
104
  [dontWaitForValidToken]: true,
105
105
  },
106
106
  },
107
+ changeSecret: {
108
+ resource: 'secret/change',
109
+ method: 'POST',
110
+ parameters: explicitObject({
111
+ subject: string(),
112
+ currentSecret: string(),
113
+ newSecret: string(),
114
+ }),
115
+ result: literal('ok'),
116
+ credentials: true,
117
+ },
107
118
  initSecretReset: {
108
119
  resource: 'secret/init-reset',
109
120
  method: 'POST',
@@ -195,7 +195,7 @@ let AuthenticationClientService = class AuthenticationClientService {
195
195
  if (isDefined(data)) {
196
196
  this.setAdditionalData(data);
197
197
  }
198
- const token = await this.client.getToken({ subject, secret, data: this.authenticationData });
198
+ const token = await this.client.login({ subject, secret, data: this.authenticationData });
199
199
  this.setNewToken(token);
200
200
  }
201
201
  /**
@@ -19,9 +19,8 @@ export declare class AuthenticationApiController<AdditionalTokenPayload extends
19
19
  * Get a token for a subject and secret.
20
20
  * @param parameters The parameters for the request.
21
21
  * @returns The token result.
22
- * @throws {InvalidCredentialsError} If the credentials are invalid.
23
22
  */
24
- getToken({ parameters }: ApiRequestContext<AuthenticationApiDefinition<AdditionalTokenPayload, AuthenticationData, AdditionalInitSecretResetData>, 'getToken'>): Promise<ApiServerResult<AuthenticationApiDefinition<AdditionalTokenPayload, AuthenticationData, AdditionalInitSecretResetData>, 'getToken'>>;
23
+ login({ parameters }: ApiRequestContext<AuthenticationApiDefinition<AdditionalTokenPayload, AuthenticationData, AdditionalInitSecretResetData>, 'login'>): Promise<ApiServerResult<AuthenticationApiDefinition<AdditionalTokenPayload, AuthenticationData, AdditionalInitSecretResetData>, 'login'>>;
25
24
  /**
26
25
  * Refresh a token.
27
26
  * @param request The request context.
@@ -49,6 +48,7 @@ export declare class AuthenticationApiController<AdditionalTokenPayload extends
49
48
  * @returns 'ok' if the session was ended.
50
49
  */
51
50
  endSession({ request }: ApiRequestContext<AuthenticationApiDefinition<AdditionalTokenPayload, AuthenticationData, AdditionalInitSecretResetData>, 'endSession'>): Promise<ApiServerResult<AuthenticationApiDefinition<AdditionalTokenPayload, AuthenticationData, AdditionalInitSecretResetData>, 'endSession'>>;
51
+ changeSecret({ parameters }: ApiRequestContext<AuthenticationApiDefinition<AdditionalTokenPayload, AuthenticationData, AdditionalInitSecretResetData>, 'changeSecret'>): Promise<ApiServerResult<AuthenticationApiDefinition<AdditionalTokenPayload, AuthenticationData, AdditionalInitSecretResetData>, 'changeSecret'>>;
52
52
  /**
53
53
  * Initialize a secret reset.
54
54
  * @param parameters The parameters for the request.
@@ -8,7 +8,6 @@ var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
10
  import { apiController } from '../../api/server/index.js';
11
- import { InvalidCredentialsError } from '../../errors/invalid-credentials.error.js';
12
11
  import { HttpServerResponse } from '../../http/server/index.js';
13
12
  import { currentTimestamp } from '../../utils/date-time.js';
14
13
  import { assertDefinedPass, isDefined } from '../../utils/type-guards.js';
@@ -33,14 +32,9 @@ let AuthenticationApiController = class AuthenticationApiController {
33
32
  * Get a token for a subject and secret.
34
33
  * @param parameters The parameters for the request.
35
34
  * @returns The token result.
36
- * @throws {InvalidCredentialsError} If the credentials are invalid.
37
35
  */
38
- async getToken({ parameters }) {
39
- const authenticationResult = await this.authenticationService.authenticate(parameters.subject, parameters.secret);
40
- if (!authenticationResult.success) {
41
- throw new InvalidCredentialsError();
42
- }
43
- const result = await this.authenticationService.getToken(authenticationResult.subject, parameters.data);
36
+ async login({ parameters }) {
37
+ const result = await this.authenticationService.login(parameters.subject, parameters.secret, parameters.data);
44
38
  return this.getTokenResponse(result);
45
39
  }
46
40
  /**
@@ -112,6 +106,10 @@ let AuthenticationApiController = class AuthenticationApiController {
112
106
  },
113
107
  });
114
108
  }
109
+ async changeSecret({ parameters }) {
110
+ await this.authenticationService.changeSecret(parameters.subject, parameters.currentSecret, parameters.newSecret);
111
+ return 'ok';
112
+ }
115
113
  /**
116
114
  * Initialize a secret reset.
117
115
  * @param parameters The parameters for the request.
@@ -130,6 +130,20 @@ type CreateRefreshTokenResult = {
130
130
  */
131
131
  export declare class AuthenticationService<AdditionalTokenPayload extends Record = Record<never>, AuthenticationData = void, AdditionalInitSecretResetData = void> implements AfterResolve {
132
132
  #private;
133
+ readonly hooks: {
134
+ beforeLogin: import("../../utils/async-hook/async-hook.js").AsyncHook<{
135
+ subject: string;
136
+ }, never, unknown>;
137
+ afterLogin: import("../../utils/async-hook/async-hook.js").AsyncHook<{
138
+ subject: string;
139
+ }, never, unknown>;
140
+ beforeChangeSecret: import("../../utils/async-hook/async-hook.js").AsyncHook<{
141
+ subject: string;
142
+ }, never, unknown>;
143
+ afterChangeSecret: import("../../utils/async-hook/async-hook.js").AsyncHook<{
144
+ subject: string;
145
+ }, never, unknown>;
146
+ };
133
147
  private readonly tokenVersion;
134
148
  private readonly tokenTimeToLive;
135
149
  private readonly refreshTokenTimeToLive;
@@ -148,7 +162,7 @@ export declare class AuthenticationService<AdditionalTokenPayload extends Record
148
162
  initialize(): Promise<void>;
149
163
  /**
150
164
  * Sets the credentials for a subject.
151
- * This method should not be exposed to the public API without a secret reset token check.
165
+ * This method should not be exposed to the public API without an authenticated current password or secret reset token check.
152
166
  * @param subject The subject to set the credentials for.
153
167
  * @param secret The secret to set.
154
168
  * @param options Options for setting the credentials.
@@ -171,6 +185,14 @@ export declare class AuthenticationService<AdditionalTokenPayload extends Record
171
185
  getToken(subject: string, authenticationData: AuthenticationData, { impersonator }?: {
172
186
  impersonator?: string;
173
187
  }): Promise<TokenResult<AdditionalTokenPayload>>;
188
+ /**
189
+ * Logs in a subject.
190
+ * @param subject The subject to log in.
191
+ * @param secret The secret to log in with.
192
+ * @param data Additional authentication data.
193
+ * @returns Token
194
+ */
195
+ login(subject: string, secret: string, data: AuthenticationData): Promise<TokenResult<AdditionalTokenPayload>>;
174
196
  /**
175
197
  * Ends a session.
176
198
  * @param sessionId The id of the session to end.
@@ -205,12 +227,19 @@ export declare class AuthenticationService<AdditionalTokenPayload extends Record
205
227
  */
206
228
  unimpersonate(impersonatorRefreshToken: string, authenticationData: AuthenticationData): Promise<TokenResult<AdditionalTokenPayload>>;
207
229
  /**
208
- * Initializes a secret reset.
230
+ * Initializes a secret reset. This usually involves sending an email for verification.
209
231
  * @param subject The subject to reset the secret for.
210
232
  * @param data Additional data for the secret reset.
211
233
  * @throws {NotImplementedError} If no ancillary service is registered.
212
234
  */
213
235
  initSecretReset(subject: string, data: AdditionalInitSecretResetData): Promise<void>;
236
+ /**
237
+ * Changes a subject's secret.
238
+ * @param subject The subject to change the secret for.
239
+ * @param currentSecret The current secret.
240
+ * @param newSecret The new secret.
241
+ */
242
+ changeSecret(subject: string, currentSecret: string, newSecret: string): Promise<void>;
214
243
  /**
215
244
  * Resets a secret.
216
245
  * @param tokenString The secret reset token.
@@ -5,6 +5,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { ForbiddenError } from '../../errors/forbidden.error.js';
8
+ import { InvalidCredentialsError } from '../../errors/index.js';
8
9
  import { InvalidTokenError } from '../../errors/invalid-token.error.js';
9
10
  import { NotFoundError } from '../../errors/not-found.error.js';
10
11
  import { NotImplementedError } from '../../errors/not-implemented.error.js';
@@ -14,6 +15,7 @@ import { Logger } from '../../logger/logger.js';
14
15
  import { DatabaseConfig } from '../../orm/server/index.js';
15
16
  import { EntityRepositoryConfig, injectRepository } from '../../orm/server/repository.js';
16
17
  import { Alphabet } from '../../utils/alphabet.js';
18
+ import { asyncHook } from '../../utils/async-hook/async-hook.js';
17
19
  import { decodeBase64, encodeBase64 } from '../../utils/base64.js';
18
20
  import { deriveBytesMultiple, importPbkdf2Key } from '../../utils/cryptography.js';
19
21
  import { currentTimestamp, timestampToTimestampSeconds } from '../../utils/date-time.js';
@@ -84,6 +86,12 @@ let AuthenticationService = class AuthenticationService {
84
86
  #keyValueStore = inject((KeyValueStore), 'authentication');
85
87
  #options = inject(AuthenticationServiceOptions);
86
88
  #logger = inject(Logger, 'authentication');
89
+ hooks = {
90
+ beforeLogin: asyncHook(),
91
+ afterLogin: asyncHook(),
92
+ beforeChangeSecret: asyncHook(),
93
+ afterChangeSecret: asyncHook(),
94
+ };
87
95
  tokenVersion = this.#options.version ?? 1;
88
96
  tokenTimeToLive = this.#options.tokenTimeToLive ?? (5 * millisecondsPerMinute);
89
97
  refreshTokenTimeToLive = this.#options.refreshTokenTimeToLive ?? (5 * millisecondsPerDay);
@@ -113,7 +121,7 @@ let AuthenticationService = class AuthenticationService {
113
121
  }
114
122
  /**
115
123
  * Sets the credentials for a subject.
116
- * This method should not be exposed to the public API without a secret reset token check.
124
+ * This method should not be exposed to the public API without an authenticated current password or secret reset token check.
117
125
  * @param subject The subject to set the credentials for.
118
126
  * @param secret The secret to set.
119
127
  * @param options Options for setting the credentials.
@@ -190,6 +198,23 @@ let AuthenticationService = class AuthenticationService {
190
198
  return { token, jsonToken, refreshToken: refreshToken.token };
191
199
  });
192
200
  }
201
+ /**
202
+ * Logs in a subject.
203
+ * @param subject The subject to log in.
204
+ * @param secret The secret to log in with.
205
+ * @param data Additional authentication data.
206
+ * @returns Token
207
+ */
208
+ async login(subject, secret, data) {
209
+ const authenticationResult = await this.authenticate(subject, secret);
210
+ if (!authenticationResult.success) {
211
+ throw new InvalidCredentialsError();
212
+ }
213
+ await this.hooks.afterLogin.trigger({ subject: authenticationResult.subject });
214
+ const token = await this.getToken(authenticationResult.subject, data);
215
+ await this.hooks.afterLogin.trigger({ subject: authenticationResult.subject });
216
+ return token;
217
+ }
193
218
  /**
194
219
  * Ends a session.
195
220
  * @param sessionId The id of the session to end.
@@ -264,14 +289,14 @@ let AuthenticationService = class AuthenticationService {
264
289
  return await this.refresh(impersonatorRefreshToken, authenticationData, { omitImpersonator: true });
265
290
  }
266
291
  /**
267
- * Initializes a secret reset.
292
+ * Initializes a secret reset. This usually involves sending an email for verification.
268
293
  * @param subject The subject to reset the secret for.
269
294
  * @param data Additional data for the secret reset.
270
295
  * @throws {NotImplementedError} If no ancillary service is registered.
271
296
  */
272
297
  async initSecretReset(subject, data) {
273
298
  if (isUndefined(this.#authenticationAncillaryService)) {
274
- throw new NotImplementedError();
299
+ throw new NotImplementedError('No ancillary service registered.');
275
300
  }
276
301
  const actualSubject = await this.tryResolveSubject(subject);
277
302
  if (isUndefined(actualSubject)) {
@@ -291,6 +316,21 @@ let AuthenticationService = class AuthenticationService {
291
316
  };
292
317
  await this.#authenticationAncillaryService.handleInitSecretReset(initSecretResetData);
293
318
  }
319
+ /**
320
+ * Changes a subject's secret.
321
+ * @param subject The subject to change the secret for.
322
+ * @param currentSecret The current secret.
323
+ * @param newSecret The new secret.
324
+ */
325
+ async changeSecret(subject, currentSecret, newSecret) {
326
+ const authenticationResult = await this.authenticate(subject, currentSecret);
327
+ if (!authenticationResult.success) {
328
+ throw new ForbiddenError('Invalid credentials.');
329
+ }
330
+ await this.hooks.beforeChangeSecret.trigger({ subject });
331
+ await this.setCredentials(subject, newSecret);
332
+ await this.hooks.afterChangeSecret.trigger({ subject });
333
+ }
294
334
  /**
295
335
  * Resets a secret.
296
336
  * @param tokenString The secret reset token.
@@ -26,7 +26,6 @@ export declare class BrowserService implements AsyncDisposable, Resolvable<Brows
26
26
  private readonly persistentBrowserContexts;
27
27
  readonly options: BrowserServiceOptions | undefined;
28
28
  readonly [resolveArgumentType]: BrowserServiceArgument;
29
- constructor(options?: BrowserServiceOptions);
30
29
  [disposeAsync](): Promise<void>;
31
30
  /**
32
31
  * @deprecated internal use only
@@ -4,14 +4,9 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- var __param = (this && this.__param) || function (paramIndex, decorator) {
11
- return function (target, key) { decorator(target, key, paramIndex); }
12
- };
13
7
  import { disposeAsync } from '../disposable/disposable.js';
14
- import { InjectArg, Singleton } from '../injector/decorators.js';
8
+ import { Singleton } from '../injector/decorators.js';
9
+ import { injectArgument } from '../injector/inject.js';
15
10
  import { filterUndefinedFromRecord } from '../utils/object/object.js';
16
11
  import { isDefined } from '../utils/type-guards.js';
17
12
  import { BrowserContextController } from './browser-context-controller.js';
@@ -22,16 +17,11 @@ export class BrowserServiceOptions {
22
17
  defaultNewBrowserOptions;
23
18
  }
24
19
  let BrowserService = class BrowserService {
25
- browsers;
26
- persistentBrowserContexts;
27
- options;
28
- constructor(options) {
29
- this.options = options;
30
- this.browsers = new Set();
31
- this.persistentBrowserContexts = new Set();
32
- }
20
+ browsers = new Set();
21
+ persistentBrowserContexts = new Set();
22
+ options = injectArgument(this, { optional: true });
33
23
  async [disposeAsync]() {
34
- return this.dispose();
24
+ await this.dispose();
35
25
  }
36
26
  /**
37
27
  * @deprecated internal use only
@@ -89,8 +79,6 @@ let BrowserService = class BrowserService {
89
79
  }
90
80
  };
91
81
  BrowserService = __decorate([
92
- Singleton(),
93
- __param(0, InjectArg()),
94
- __metadata("design:paramtypes", [BrowserServiceOptions])
82
+ Singleton()
95
83
  ], BrowserService);
96
84
  export { BrowserService };
@@ -79,9 +79,9 @@ import { DocumentFileService } from './document-file.service.js';
79
79
  import { DocumentPropertyService } from './document-property.service.js';
80
80
  import { DocumentTagService } from './document-tag.service.js';
81
81
  import { DocumentManagementSingleton } from './singleton.js';
82
- const CLASSIFY_MODEL = 'gemini-2.5-flash-lite-preview-06-17';
82
+ const CLASSIFY_MODEL = 'gemini-2.5-flash-lite';
83
83
  const EXTRACT_MODEL = 'gemini-2.5-flash';
84
- const ASSIGN_MODEL = 'gemini-2.5-flash-lite-preview-06-17';
84
+ const ASSIGN_MODEL = 'gemini-2.5-flash-lite';
85
85
  let DocumentManagementAiService = DocumentManagementAiService_1 = class DocumentManagementAiService {
86
86
  #documentCollectionService = inject(DocumentCollectionService);
87
87
  #documentTagService = inject(DocumentTagService);
@@ -4,7 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { and, isNotNull as drizzleIsNotNull, isNull as drizzleIsNull, eq, inArray, or } from 'drizzle-orm';
7
+ import { and, isNotNull as drizzleIsNotNull, isNull as drizzleIsNull, eq, inArray, or, sql } from 'drizzle-orm';
8
8
  import { BadRequestError } from '../../../errors/bad-request.error.js';
9
9
  import { NotFoundError } from '../../../errors/not-found.error.js';
10
10
  import { inject } from '../../../injector/index.js';
@@ -39,7 +39,7 @@ let DocumentPropertyService = class DocumentPropertyService extends Transactiona
39
39
  propertyTenantId: autoAlias(documentProperty.tenantId),
40
40
  label: documentProperty.label,
41
41
  dataType: documentProperty.dataType,
42
- value: coalesce(toJsonb(documentPropertyValue.text), toJsonb(documentPropertyValue.integer), toJsonb(documentPropertyValue.decimal), toJsonb(documentPropertyValue.boolean), toJsonb(documentPropertyValue.date)).as('value'),
42
+ value: coalesce(toJsonb(documentPropertyValue.text), toJsonb(documentPropertyValue.integer), toJsonb(documentPropertyValue.decimal), toJsonb(documentPropertyValue.boolean), toJsonb(sql `${documentPropertyValue.date} - '1970-01-01'`)).as('value'),
43
43
  })
44
44
  .from(document)
45
45
  .innerJoin(documentType, and(eq(documentType.id, document.typeId), or(drizzleIsNull(documentType.tenantId), eq(documentType.tenantId, document.tenantId))))
@@ -117,7 +117,7 @@ let DocumentPropertyService = class DocumentPropertyService extends Transactiona
117
117
  });
118
118
  const deletePropertyIds = propertyValues.filter((value) => isNull(value.value)).map(({ propertyId }) => propertyId);
119
119
  await this.#documentPropertyValueRepository.withTransaction(tx).hardDeleteManyByQuery({ tenantId: document.tenantId, documentId: document.id, propertyId: { $in: deletePropertyIds } });
120
- await this.#documentPropertyValueRepository.withTransaction(tx).upsertMany(['documentId', 'propertyId'], upserts);
120
+ await this.#documentPropertyValueRepository.withTransaction(tx).upsertMany(['tenantId', 'documentId', 'propertyId'], upserts);
121
121
  this.#observationService.documentChange(document.id, tx);
122
122
  });
123
123
  }
@@ -21,7 +21,7 @@ let AiValidationExecutor = class AiValidationExecutor extends DocumentValidation
21
21
  async execute(context) {
22
22
  const validationPrompt = await this.getPrompt(context);
23
23
  const model = match(this.difficulty)
24
- .with('easy', () => 'gemini-2.5-flash-lite-preview-06-17')
24
+ .with('easy', () => 'gemini-2.5-flash-lite')
25
25
  .with('medium-low', () => 'gemini-2.5-flash')
26
26
  .with('medium-high', () => 'gemini-2.5-flash')
27
27
  .with('hard', () => 'gemini-2.5-pro')
@@ -3,6 +3,7 @@ import type { TypedOmit } from '../../../types/index.js';
3
3
  import type { DocumentApproval, DocumentTag, DocumentValidationExecution, DocumentWorkflow } from '../../models/index.js';
4
4
  import type { DocumentPropertyValueView, DocumentView } from '../document-management.view-model.js';
5
5
  import { EnrichedDocumentAssignment } from './enriched-document-assignment.view.js';
6
+ import type { EnrichedDocumentCategory } from './enriched-document-category.view.js';
6
7
  import type { EnrichedDocumentManagementData } from './enriched-document-management-data.view.js';
7
8
  import type { EnrichedDocumentType } from './enriched-document-type.view.js';
8
9
  export declare class EnrichedDocument implements TypedOmit<DocumentView, 'typeId' | 'assignment' | 'tagIds' | 'createUserId'> {
@@ -23,6 +24,7 @@ export declare class EnrichedDocument implements TypedOmit<DocumentView, 'typeId
23
24
  readonly workflows: DocumentWorkflow[];
24
25
  readonly validations: DocumentValidationExecution[];
25
26
  readonly metadata: EntityMetadata;
27
+ get category(): EnrichedDocumentCategory | null;
26
28
  get type(): EnrichedDocumentType | null;
27
29
  get assignments(): EnrichedDocumentAssignment;
28
30
  get tags(): DocumentTag[];
@@ -29,6 +29,9 @@ export class EnrichedDocument {
29
29
  workflows;
30
30
  validations;
31
31
  metadata;
32
+ get category() {
33
+ return this.type?.category ?? null;
34
+ }
32
35
  get type() {
33
36
  if (isNull(this.#documentView.typeId)) {
34
37
  return null;
@@ -74,6 +77,11 @@ export class EnrichedDocument {
74
77
  this.metadata = document.metadata;
75
78
  }
76
79
  }
80
+ __decorate([
81
+ Memoize(),
82
+ __metadata("design:type", Object),
83
+ __metadata("design:paramtypes", [])
84
+ ], EnrichedDocument.prototype, "category", null);
77
85
  __decorate([
78
86
  Memoize(),
79
87
  __metadata("design:type", Object),
@@ -1,8 +1,6 @@
1
- import { Logger } from '../../logger/index.js';
2
1
  import type { MessageBusProvider } from '../message-bus-provider.js';
3
2
  import type { MessageBus } from '../message-bus.js';
4
3
  export declare class BroadcastChannelMessageBusProvider implements MessageBusProvider {
5
4
  private readonly logger;
6
- constructor(logger: Logger);
7
5
  get<T>(channel: string): MessageBus<T>;
8
6
  }
@@ -4,27 +4,17 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- var __param = (this && this.__param) || function (paramIndex, decorator) {
11
- return function (target, key) { decorator(target, key, paramIndex); }
12
- };
13
- import { Injectable, ResolveArg } from '../../injector/index.js';
7
+ var BroadcastChannelMessageBusProvider_1;
8
+ import { inject, Injectable } from '../../injector/index.js';
14
9
  import { Logger } from '../../logger/index.js';
15
10
  import { BroadcastChannelMessageBus } from './broadcast-channel-message-bus.js';
16
- let BroadcastChannelMessageBusProvider = class BroadcastChannelMessageBusProvider {
17
- logger;
18
- constructor(logger) {
19
- this.logger = logger;
20
- }
11
+ let BroadcastChannelMessageBusProvider = BroadcastChannelMessageBusProvider_1 = class BroadcastChannelMessageBusProvider {
12
+ logger = inject(Logger, BroadcastChannelMessageBusProvider_1.name);
21
13
  get(channel) {
22
14
  return new BroadcastChannelMessageBus(() => new BroadcastChannel(channel), this.logger);
23
15
  }
24
16
  };
25
- BroadcastChannelMessageBusProvider = __decorate([
26
- Injectable(),
27
- __param(0, ResolveArg('BroadcastChannelMessageBusProvider')),
28
- __metadata("design:paramtypes", [Logger])
17
+ BroadcastChannelMessageBusProvider = BroadcastChannelMessageBusProvider_1 = __decorate([
18
+ Injectable()
29
19
  ], BroadcastChannelMessageBusProvider);
30
20
  export { BroadcastChannelMessageBusProvider };
@@ -1,9 +1,7 @@
1
- import { Logger } from '../../logger/index.js';
2
1
  import { MessageBusProvider } from '../message-bus-provider.js';
3
2
  import { LocalMessageBus } from './local-message-bus.js';
4
3
  export declare class LocalMessageBusProvider extends MessageBusProvider {
5
4
  private readonly logger;
6
5
  private readonly channelSubjectsMap;
7
- constructor(logger: Logger);
8
6
  get<T>(channel: string): LocalMessageBus<T>;
9
7
  }
@@ -4,28 +4,18 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- var __param = (this && this.__param) || function (paramIndex, decorator) {
11
- return function (target, key) { decorator(target, key, paramIndex); }
12
- };
7
+ var LocalMessageBusProvider_1;
13
8
  import { Subject } from 'rxjs';
14
9
  import { WeakRefMap } from '../../data-structures/weak-ref-map.js';
15
- import { ResolveArg, Singleton } from '../../injector/index.js';
10
+ import { inject, Singleton } from '../../injector/index.js';
16
11
  import { Logger } from '../../logger/index.js';
17
12
  import { FactoryMap } from '../../utils/factory-map.js';
18
13
  import { isUndefined } from '../../utils/type-guards.js';
19
14
  import { MessageBusProvider } from '../message-bus-provider.js';
20
15
  import { LocalMessageBus } from './local-message-bus.js';
21
- let LocalMessageBusProvider = class LocalMessageBusProvider extends MessageBusProvider {
22
- logger;
23
- channelSubjectsMap;
24
- constructor(logger) {
25
- super();
26
- this.logger = logger;
27
- this.channelSubjectsMap = new FactoryMap(() => new Subject(), WeakRefMap.supported ? new WeakRefMap() : undefined);
28
- }
16
+ let LocalMessageBusProvider = LocalMessageBusProvider_1 = class LocalMessageBusProvider extends MessageBusProvider {
17
+ logger = inject(Logger, LocalMessageBusProvider_1.name);
18
+ channelSubjectsMap = new FactoryMap(() => new Subject(), WeakRefMap.supported ? new WeakRefMap() : undefined);
29
19
  get(channel) {
30
20
  const subject = this.channelSubjectsMap.get(channel);
31
21
  if (isUndefined(subject)) {
@@ -35,9 +25,7 @@ let LocalMessageBusProvider = class LocalMessageBusProvider extends MessageBusPr
35
25
  return new LocalMessageBus(subject, this.logger);
36
26
  }
37
27
  };
38
- LocalMessageBusProvider = __decorate([
39
- Singleton(),
40
- __param(0, ResolveArg('LocalMessageBus')),
41
- __metadata("design:paramtypes", [Logger])
28
+ LocalMessageBusProvider = LocalMessageBusProvider_1 = __decorate([
29
+ Singleton()
42
30
  ], LocalMessageBusProvider);
43
31
  export { LocalMessageBusProvider };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tstdl/base",
3
- "version": "0.92.155",
3
+ "version": "0.92.156",
4
4
  "author": "Patrick Hein",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -148,8 +148,8 @@
148
148
  },
149
149
  "peerDependencies": {
150
150
  "@elastic/elasticsearch": "^9.1",
151
- "@google-cloud/storage": "^7.16",
152
- "@google/genai": "^1.14",
151
+ "@google-cloud/storage": "^7.17",
152
+ "@google/genai": "^1.15",
153
153
  "@tstdl/angular": "^0.92",
154
154
  "@zxcvbn-ts/core": "^3.0",
155
155
  "@zxcvbn-ts/language-common": "^3.0",
@@ -196,7 +196,7 @@
196
196
  "typedoc-plugin-markdown": "4.8",
197
197
  "typedoc-plugin-missing-exports": "4.1",
198
198
  "typescript": "5.8",
199
- "typescript-eslint": "8.39"
199
+ "typescript-eslint": "8.40"
200
200
  },
201
201
  "overrides": {
202
202
  "drizzle-kit": {
@@ -20,7 +20,7 @@ const indexes = [
20
20
  { key: { queue: 1, priority: 1, enqueueTimestamp: 1, lastDequeueTimestamp: 1, tries: 1 } },
21
21
  { key: { queue: 1, tag: 1 } },
22
22
  { key: { queue: 1, batch: 1 } },
23
- { key: { queue: 1, tries: 1 } }
23
+ { key: { queue: 1, tries: 1 } },
24
24
  ];
25
25
  let MongoJobRepository = class MongoJobRepository extends MongoEntityRepository {
26
26
  constructor(collection, logger) {
@@ -31,7 +31,7 @@ let MongoJobRepository = class MongoJobRepository extends MongoEntityRepository
31
31
  const updateQuery = (uniqueTagStrategy == UniqueTagStrategy.KeepOld)
32
32
  ? { $setOnInsert: { _id: getNewId(), ...rest } }
33
33
  : { $set: rest, $setOnInsert: { _id: getNewId() } };
34
- return this.baseRepository.loadByFilterAndUpdate({ queue, tag }, updateQuery, { upsert: true, returnDocument: 'after' });
34
+ return await this.baseRepository.loadByFilterAndUpdate({ queue, tag }, updateQuery, { upsert: true, returnDocument: 'after' });
35
35
  }
36
36
  async bulkInsertWithUniqueTagStrategy(newJobs, uniqueTagStrategy) {
37
37
  const bulk = this.baseRepository.bulk();
@@ -1,17 +1,13 @@
1
1
  import type { CollectionArgument, MongoRepositoryConfig } from '../../database/mongo/index.js';
2
- import { resolveArgumentType, type Resolvable } from '../../injector/interfaces.js';
3
- import { LockProvider } from '../../lock/index.js';
4
- import { MessageBusProvider } from '../../message-bus/index.js';
2
+ import { resolveArgumentType, type Resolvable } from '../../injector/index.js';
5
3
  import { QueueProvider, type QueueConfig } from '../../queue/index.js';
6
4
  import type { MongoJob } from './job.js';
7
- import { MongoJobRepository } from './mongo-job.repository.js';
8
5
  import { MongoQueue } from './queue.js';
9
6
  export declare class MongoQueueProvider extends QueueProvider implements Resolvable<CollectionArgument<MongoJob>> {
10
7
  private readonly repository;
11
8
  private readonly lockProvider;
12
9
  private readonly messageBusProvider;
13
10
  readonly [resolveArgumentType]: CollectionArgument<MongoJob>;
14
- constructor(repository: MongoJobRepository<any>, lockProvider: LockProvider, messageBusProvider: MessageBusProvider);
15
11
  get<T>(name: string, config?: QueueConfig): MongoQueue<T>;
16
12
  }
17
13
  /**
@@ -4,15 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- var __param = (this && this.__param) || function (paramIndex, decorator) {
11
- return function (target, key) { decorator(target, key, paramIndex); }
12
- };
13
- import { ForwardArg, ResolveArg, Singleton } from '../../injector/decorators.js';
14
- import { Injector } from '../../injector/injector.js';
15
- import { resolveArgumentType } from '../../injector/interfaces.js';
7
+ import { inject, injectArgument, Injector, resolveArgumentType, Singleton } from '../../injector/index.js';
16
8
  import { LockProvider } from '../../lock/index.js';
17
9
  import { MessageBusProvider } from '../../message-bus/index.js';
18
10
  import { Queue, QueueProvider } from '../../queue/index.js';
@@ -20,25 +12,16 @@ import { MongoJobRepository } from './mongo-job.repository.js';
20
12
  import { MongoQueue } from './queue.js';
21
13
  let defaultJobRepositoryConfig;
22
14
  let MongoQueueProvider = class MongoQueueProvider extends QueueProvider {
23
- repository;
24
- lockProvider;
25
- messageBusProvider;
26
- constructor(repository, lockProvider, messageBusProvider) {
27
- super();
28
- this.repository = repository;
29
- this.lockProvider = lockProvider;
30
- this.messageBusProvider = messageBusProvider;
31
- }
15
+ repository = inject((MongoJobRepository), injectArgument(this));
16
+ lockProvider = inject(LockProvider, 'queue:');
17
+ messageBusProvider = inject(MessageBusProvider);
32
18
  get(name, config) {
33
19
  const lock = this.lockProvider.get(name);
34
20
  return new MongoQueue(this.repository, lock, this.messageBusProvider, name, config);
35
21
  }
36
22
  };
37
23
  MongoQueueProvider = __decorate([
38
- Singleton({ defaultArgumentProvider: () => defaultJobRepositoryConfig }),
39
- __param(0, ForwardArg()),
40
- __param(1, ResolveArg('queue:')),
41
- __metadata("design:paramtypes", [MongoJobRepository, LockProvider, MessageBusProvider])
24
+ Singleton({ defaultArgumentProvider: () => defaultJobRepositoryConfig })
42
25
  ], MongoQueueProvider);
43
26
  export { MongoQueueProvider };
44
27
  /**
@@ -9,7 +9,7 @@ import { TEMPLATE_RENDERERS, TEMPLATE_RESOLVERS } from './tokens.js';
9
9
  export const templateModuleConfig = {
10
10
  templateProvider: undefined,
11
11
  templateResolvers: [StringTemplateResolver],
12
- templateRenderers: [StringTemplateRenderer]
12
+ templateRenderers: [StringTemplateRenderer],
13
13
  };
14
14
  Injector.registerSingleton(TEMPLATE_RESOLVERS, { useToken: TemplateResolver, resolveAll: true });
15
15
  Injector.registerSingleton(TEMPLATE_RENDERERS, { useToken: TemplateRenderer, resolveAll: true });
@@ -1,7 +1,6 @@
1
1
  import type { TemplateRenderer } from './template.renderer.js';
2
2
  export declare class TemplateRendererProvider {
3
3
  private readonly renderers;
4
- constructor(renderers?: TemplateRenderer[]);
5
4
  register(renderer: TemplateRenderer): void;
6
5
  has(type: string): boolean;
7
6
  get(type: string): TemplateRenderer;
@@ -4,19 +4,10 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- var __param = (this && this.__param) || function (paramIndex, decorator) {
11
- return function (target, key) { decorator(target, key, paramIndex); }
12
- };
13
- import { Inject, Optional, Singleton } from '../injector/decorators.js';
7
+ import { inject, Singleton } from '../injector/index.js';
14
8
  import { TEMPLATE_RENDERERS } from './tokens.js';
15
9
  let TemplateRendererProvider = class TemplateRendererProvider {
16
- renderers;
17
- constructor(renderers = []) {
18
- this.renderers = new Set(renderers);
19
- }
10
+ renderers = new Set(inject(TEMPLATE_RENDERERS, undefined, { optional: true }) ?? []);
20
11
  register(renderer) {
21
12
  this.renderers.add(renderer);
22
13
  }
@@ -38,9 +29,6 @@ let TemplateRendererProvider = class TemplateRendererProvider {
38
29
  }
39
30
  };
40
31
  TemplateRendererProvider = __decorate([
41
- Singleton(),
42
- __param(0, Inject(TEMPLATE_RENDERERS)),
43
- __param(0, Optional()),
44
- __metadata("design:paramtypes", [Array])
32
+ Singleton()
45
33
  ], TemplateRendererProvider);
46
34
  export { TemplateRendererProvider };
@@ -1,7 +1,6 @@
1
1
  import type { TemplateResolver } from './template.resolver.js';
2
2
  export declare class TemplateResolverProvider {
3
3
  private readonly resolvers;
4
- constructor(resolvers?: TemplateResolver[]);
5
4
  register(renderer: TemplateResolver): void;
6
5
  has(type: string): boolean;
7
6
  get(type: string): TemplateResolver;
@@ -4,19 +4,10 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- var __param = (this && this.__param) || function (paramIndex, decorator) {
11
- return function (target, key) { decorator(target, key, paramIndex); }
12
- };
13
- import { Inject, Optional, Singleton } from '../injector/decorators.js';
7
+ import { inject, Singleton } from '../injector/index.js';
14
8
  import { TEMPLATE_RESOLVERS } from './tokens.js';
15
9
  let TemplateResolverProvider = class TemplateResolverProvider {
16
- resolvers;
17
- constructor(resolvers = []) {
18
- this.resolvers = new Set(resolvers);
19
- }
10
+ resolvers = new Set(inject(TEMPLATE_RESOLVERS, undefined, { optional: true }) ?? []);
20
11
  register(renderer) {
21
12
  this.resolvers.add(renderer);
22
13
  }
@@ -38,9 +29,6 @@ let TemplateResolverProvider = class TemplateResolverProvider {
38
29
  }
39
30
  };
40
31
  TemplateResolverProvider = __decorate([
41
- Singleton(),
42
- __param(0, Inject(TEMPLATE_RESOLVERS)),
43
- __param(0, Optional()),
44
- __metadata("design:paramtypes", [Array])
32
+ Singleton()
45
33
  ], TemplateResolverProvider);
46
34
  export { TemplateResolverProvider };
@@ -1,8 +1,5 @@
1
1
  import type { Record } from '../types/index.js';
2
- import { TemplateRendererProvider } from './template-renderer.provider.js';
3
- import { TemplateResolverProvider } from './template-resolver.provider.js';
4
2
  import type { Template, TemplateContext } from './template.model.js';
5
- import { TemplateProvider } from './template.provider.js';
6
3
  export type TemplateServiceRenderResult<T extends Template = Template> = {
7
4
  name: string;
8
5
  fields: Record<keyof T['fields'], string>;
@@ -12,7 +9,6 @@ export declare class TemplateService {
12
9
  private readonly templateProvider;
13
10
  private readonly templateRendererProvider;
14
11
  private readonly templateResolverProvider;
15
- constructor(templateProvider: TemplateProvider | undefined, templateRendererProvider: TemplateRendererProvider, templateResolverProvider: TemplateResolverProvider);
16
12
  get<T extends Template = Template>(key: string): Promise<T>;
17
13
  render<T extends Template = Template>(keyOrTemplate: string | T, templateContext?: TemplateContext<T>): Promise<TemplateServiceRenderResult<T>>;
18
14
  }
@@ -4,13 +4,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- var __param = (this && this.__param) || function (paramIndex, decorator) {
11
- return function (target, key) { decorator(target, key, paramIndex); }
12
- };
13
- import { Inject, Optional, Singleton } from '../injector/decorators.js';
7
+ import { Singleton } from '../injector/decorators.js';
8
+ import { inject } from '../injector/inject.js';
14
9
  import { objectEntries } from '../utils/object/object.js';
15
10
  import { _throw } from '../utils/throw.js';
16
11
  import { isString } from '../utils/type-guards.js';
@@ -18,14 +13,9 @@ import { TemplateRendererProvider } from './template-renderer.provider.js';
18
13
  import { TemplateResolverProvider } from './template-resolver.provider.js';
19
14
  import { TemplateProvider } from './template.provider.js';
20
15
  let TemplateService = class TemplateService {
21
- templateProvider;
22
- templateRendererProvider;
23
- templateResolverProvider;
24
- constructor(templateProvider, templateRendererProvider, templateResolverProvider) {
25
- this.templateProvider = templateProvider ?? { get: () => _throw(new Error('No template provider provided. Cannot render template-keys.')) };
26
- this.templateRendererProvider = templateRendererProvider;
27
- this.templateResolverProvider = templateResolverProvider;
28
- }
16
+ templateProvider = inject(TemplateProvider, undefined, { optional: true }) ?? { get: () => _throw(new Error('No template provider provided. Cannot render template-keys.')) };
17
+ templateRendererProvider = inject(TemplateRendererProvider);
18
+ templateResolverProvider = inject(TemplateResolverProvider);
29
19
  async get(key) {
30
20
  const template = await this.templateProvider.get(key);
31
21
  return template;
@@ -48,10 +38,6 @@ let TemplateService = class TemplateService {
48
38
  }
49
39
  };
50
40
  TemplateService = __decorate([
51
- Singleton(),
52
- __param(0, Inject(TemplateProvider)),
53
- __param(0, Optional()),
54
- __metadata("design:paramtypes", [Object, TemplateRendererProvider,
55
- TemplateResolverProvider])
41
+ Singleton()
56
42
  ], TemplateService);
57
43
  export { TemplateService };
@@ -1,5 +1,4 @@
1
1
  import type { Observable } from 'rxjs';
2
- import { Logger } from '../logger/index.js';
3
2
  import type { Signal } from '../signals/api.js';
4
3
  import type { Enumeration, EnumerationValue, Record } from '../types/index.js';
5
4
  import type { PropertyName } from '../utils/object/property-name.js';
@@ -69,7 +68,6 @@ export declare class LocalizationService {
69
68
  readonly availableLanguages: Signal<Language[]>;
70
69
  readonly activeLanguage$: Observable<Language | null>;
71
70
  readonly availableLanguages$: Observable<Language[]>;
72
- constructor(logger: Logger);
73
71
  registerLocalization(...localizations: Localization[]): void;
74
72
  hasLanguage(languageCode: string): boolean;
75
73
  getLanguage(languageCode: string): Language;
@@ -4,14 +4,10 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- var __param = (this && this.__param) || function (paramIndex, decorator) {
11
- return function (target, key) { decorator(target, key, paramIndex); }
12
- };
7
+ var _a;
8
+ var LocalizationService_1;
13
9
  import { DetailsError } from '../errors/details.error.js';
14
- import { ResolveArg, Singleton } from '../injector/decorators.js';
10
+ import { inject, Singleton } from '../injector/index.js';
15
11
  import { Logger } from '../logger/index.js';
16
12
  import { computed, signal, toObservable } from '../signals/api.js';
17
13
  import { enumEntries, enumValueName } from '../utils/enum.js';
@@ -48,8 +44,8 @@ export function getLocalizationKeys(_localization) {
48
44
  export const autoEnumerationLocalization = memoize(_autoEnumerationLocalization);
49
45
  const parametersPattern = /(?:\{\{\s*(?<parameter>\w+)\s*\}\})/ug;
50
46
  const warnedMissingKeys = new Set();
51
- let LocalizationService = class LocalizationService {
52
- #logger;
47
+ let LocalizationService = LocalizationService_1 = class LocalizationService {
48
+ #logger = inject(Logger, LocalizationService_1.name);
53
49
  #localizations = new Map();
54
50
  #activeLanguage = signal(null);
55
51
  #availableLanguages = signal([]);
@@ -64,9 +60,6 @@ let LocalizationService = class LocalizationService {
64
60
  availableLanguages = this.#availableLanguages.asReadonly();
65
61
  activeLanguage$ = toObservable(this.activeLanguage);
66
62
  availableLanguages$ = toObservable(this.availableLanguages);
67
- constructor(logger) {
68
- this.#logger = logger;
69
- }
70
63
  registerLocalization(...localizations) {
71
64
  for (const localization of localizations) {
72
65
  const mappedLocalization = buildMappedLocalization(localization);
@@ -180,10 +173,8 @@ let LocalizationService = class LocalizationService {
180
173
  return result;
181
174
  }
182
175
  };
183
- LocalizationService = __decorate([
184
- Singleton(),
185
- __param(0, ResolveArg('LocalizationService')),
186
- __metadata("design:paramtypes", [Logger])
176
+ LocalizationService = LocalizationService_1 = __decorate([
177
+ Singleton()
187
178
  ], LocalizationService);
188
179
  export { LocalizationService };
189
180
  export function enumerationLocalization(enumeration, nameOrLocalization, localizationOrNothing) {