@tstdl/base 0.85.14 → 0.85.16

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 (42) hide show
  1. package/data-structures/array-list.d.ts +1 -1
  2. package/data-structures/array-list.js +4 -4
  3. package/data-structures/circular-buffer.js +5 -2
  4. package/data-structures/distinct-collection.d.ts +24 -0
  5. package/data-structures/distinct-collection.js +77 -0
  6. package/data-structures/index.d.ts +2 -1
  7. package/data-structures/index.js +2 -1
  8. package/data-structures/list.js +13 -5
  9. package/data-structures/multi-key-map.d.ts +1 -1
  10. package/data-structures/multi-key-map.js +2 -0
  11. package/data-structures/multi-key-set.d.ts +19 -0
  12. package/data-structures/multi-key-set.js +81 -0
  13. package/data-structures/{set.d.ts → set-collection.d.ts} +2 -2
  14. package/data-structures/{set.js → set-collection.js} +6 -6
  15. package/data-structures/sorted-array-list.d.ts +1 -1
  16. package/data-structures/sorted-array-list.js +1 -4
  17. package/data-structures/weak-ref-map.js +4 -1
  18. package/injector/decorators.d.ts +70 -0
  19. package/injector/decorators.js +112 -0
  20. package/injector/inject.d.ts +80 -0
  21. package/injector/inject.js +94 -0
  22. package/injector/injector.d.ts +111 -0
  23. package/injector/injector.js +454 -0
  24. package/injector/interfaces.d.ts +14 -0
  25. package/injector/interfaces.js +26 -0
  26. package/injector/provider.d.ts +44 -0
  27. package/injector/provider.js +64 -0
  28. package/injector/resolve-chain.d.ts +31 -0
  29. package/injector/resolve-chain.js +113 -0
  30. package/injector/resolve.error.d.ts +5 -0
  31. package/injector/resolve.error.js +36 -0
  32. package/injector/symbols.d.ts +2 -0
  33. package/injector/symbols.js +26 -0
  34. package/injector/token.d.ts +18 -0
  35. package/injector/token.js +41 -0
  36. package/injector/type-info.d.ts +26 -0
  37. package/injector/type-info.js +16 -0
  38. package/injector/types.d.ts +43 -0
  39. package/injector/types.js +16 -0
  40. package/package.json +9 -9
  41. package/pool/pool.js +2 -2
  42. package/utils/type-guards.js +2 -2
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var resolve_chain_exports = {};
20
+ __export(resolve_chain_exports, {
21
+ ResolveChain: () => ResolveChain
22
+ });
23
+ module.exports = __toCommonJS(resolve_chain_exports);
24
+ var import_reflection = require("../reflection/index.js");
25
+ var import_type_guards = require("../utils/type-guards.js");
26
+ var import_token = require("./token.js");
27
+ class ResolveChain {
28
+ nodes;
29
+ get length() {
30
+ return this.nodes.length;
31
+ }
32
+ constructor(nodes) {
33
+ this.nodes = nodes ?? [];
34
+ }
35
+ static startWith(token) {
36
+ const chain = new ResolveChain();
37
+ return chain.addToken(token);
38
+ }
39
+ addToken(token) {
40
+ const node = { type: "token", token };
41
+ return new ResolveChain([...this.nodes, node]);
42
+ }
43
+ addInject(token, index) {
44
+ const node = { type: "inject", token, index };
45
+ return new ResolveChain([...this.nodes, node]);
46
+ }
47
+ addParameter(constructor, index, token) {
48
+ const node = { type: "parameter", constructor, index, token };
49
+ return new ResolveChain([...this.nodes, node]);
50
+ }
51
+ addProperty(constructor, property, token) {
52
+ const node = { type: "property", constructor, property, token };
53
+ return new ResolveChain([...this.nodes, node]);
54
+ }
55
+ format(truncate) {
56
+ let chainString = "";
57
+ const chain = (0, import_type_guards.isDefined)(truncate) ? this.truncate(truncate) : this;
58
+ if (chain.length < this.length) {
59
+ chainString += "\n [...]";
60
+ }
61
+ for (const node of chain.nodes) {
62
+ const tokenName = (0, import_token.getTokenName)(node.token);
63
+ switch (node.type) {
64
+ case "token":
65
+ chainString += `
66
+ -> ${tokenName}`;
67
+ break;
68
+ case "inject":
69
+ chainString += `
70
+ -> inject(${tokenName}) #${node.index + 1}`;
71
+ break;
72
+ case "parameter":
73
+ const metadata = import_reflection.reflectionRegistry.getMetadata(node.constructor);
74
+ const prefix = "_, ".repeat(node.index);
75
+ const suffix = ", _".repeat((0, import_type_guards.assertDefinedPass)(metadata?.parameters, "missing parameters metadata").length - node.index - 1);
76
+ chainString += `(${prefix}${tokenName}${suffix})`;
77
+ break;
78
+ case "property":
79
+ const constructorName = (0, import_token.getTokenName)(node.constructor);
80
+ const key = getPropertyKeyString(node.property);
81
+ chainString += `
82
+ -> ${constructorName}[${key}]: ${tokenName}`;
83
+ break;
84
+ default:
85
+ throw new Error(`unknown chain node type ${node.type}`);
86
+ }
87
+ }
88
+ return chainString;
89
+ }
90
+ truncate(tokenCount) {
91
+ const truncatedChain = [];
92
+ let counter = 0;
93
+ for (let i = this.nodes.length - 1; i >= 0 && counter < tokenCount; i--) {
94
+ const node = this.nodes[i];
95
+ truncatedChain.unshift(node);
96
+ if (node.type == "token") {
97
+ counter++;
98
+ }
99
+ }
100
+ return new ResolveChain(truncatedChain);
101
+ }
102
+ }
103
+ function getPropertyKeyString(key) {
104
+ switch (typeof key) {
105
+ case "number":
106
+ case "symbol":
107
+ return key.toString();
108
+ case "string":
109
+ return `'${key}'`;
110
+ default:
111
+ throw new Error(`unsupported key type ${typeof key}`);
112
+ }
113
+ }
@@ -0,0 +1,5 @@
1
+ import { CustomError } from '../error/custom.error.js';
2
+ import { ResolveChain } from './resolve-chain.js';
3
+ export declare class ResolveError extends CustomError {
4
+ constructor(message: string, chain: ResolveChain, cause?: Error);
5
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var resolve_error_exports = {};
20
+ __export(resolve_error_exports, {
21
+ ResolveError: () => ResolveError
22
+ });
23
+ module.exports = __toCommonJS(resolve_error_exports);
24
+ var import_custom_error = require("../error/custom.error.js");
25
+ var import_type_guards = require("../utils/type-guards.js");
26
+ class ResolveError extends import_custom_error.CustomError {
27
+ constructor(message, chain, cause) {
28
+ const causeMessage = (0, import_type_guards.isDefined)(cause) ? `
29
+ cause: ${cause.message}` : "";
30
+ super({
31
+ message: `${message}${causeMessage}
32
+ chain: ${chain.format(15)}`,
33
+ cause
34
+ });
35
+ }
36
+ }
@@ -0,0 +1,2 @@
1
+ export declare const injectableMetadataSymbol: unique symbol;
2
+ export declare const injectMetadataSymbol: unique symbol;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var symbols_exports = {};
20
+ __export(symbols_exports, {
21
+ injectMetadataSymbol: () => injectMetadataSymbol,
22
+ injectableMetadataSymbol: () => injectableMetadataSymbol
23
+ });
24
+ module.exports = __toCommonJS(symbols_exports);
25
+ const injectableMetadataSymbol = Symbol("Injectable metadata");
26
+ const injectMetadataSymbol = Symbol("Inject metadata");
@@ -0,0 +1,18 @@
1
+ import type { AbstractConstructor } from '../types.js';
2
+ declare const type: unique symbol;
3
+ declare const argument: unique symbol;
4
+ export type ArgumentedInjectionToken<T, A> = SimpleInjectionToken<T> & {
5
+ [argument]?: A;
6
+ };
7
+ export type SimpleInjectionToken<T> = AbstractConstructor<T> | object;
8
+ export type InjectionToken<T = any, A = any> = SimpleInjectionToken<T> | ArgumentedInjectionToken<T, A> | ReifyingInjectionToken<T, A>;
9
+ export declare class ReifyingInjectionToken<T = any, A = any> {
10
+ private readonly [type];
11
+ private readonly [argument];
12
+ readonly description: string;
13
+ constructor(description: string);
14
+ toString(): string;
15
+ }
16
+ export declare function injectionToken<T, A = never>(description: string): InjectionToken<T, A>;
17
+ export declare function getTokenName(token: InjectionToken | undefined): string;
18
+ export {};
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var token_exports = {};
20
+ __export(token_exports, {
21
+ ReifyingInjectionToken: () => ReifyingInjectionToken,
22
+ getTokenName: () => getTokenName,
23
+ injectionToken: () => injectionToken
24
+ });
25
+ module.exports = __toCommonJS(token_exports);
26
+ var import_type_guards = require("../utils/type-guards.js");
27
+ class ReifyingInjectionToken {
28
+ description;
29
+ constructor(description) {
30
+ this.description = description;
31
+ }
32
+ toString() {
33
+ return `InjectionToken["${this.description}"]`;
34
+ }
35
+ }
36
+ function injectionToken(description) {
37
+ return new ReifyingInjectionToken(description);
38
+ }
39
+ function getTokenName(token) {
40
+ return (0, import_type_guards.isFunction)(token) ? token.name : (0, import_type_guards.isString)(token) ? `"${token}"` : String(token);
41
+ }
@@ -0,0 +1,26 @@
1
+ import type { OneOrMany } from '../types.js';
2
+ import type { Provider } from './provider.js';
3
+ import type { InjectionToken } from './token.js';
4
+ import type { ArgumentProvider, ForwardRefInjectionToken, Mapper, RegistrationOptions } from './types.js';
5
+ export type InjectableMetadata<T, A> = RegistrationOptions<T, A> & {
6
+ /** aliases (tokens) for the class. Useful for example for circular dependencies when you can't use the class itself as a token */
7
+ alias?: OneOrMany<InjectionToken>;
8
+ /** custom provider. Useful for example if initialization is required */
9
+ provider?: Provider<T, A>;
10
+ };
11
+ export type InjectMetadata = {
12
+ /** token overwrite by inject decorator */
13
+ injectToken?: InjectionToken;
14
+ /** if defined, resolve the ForwardRefToken using ForwardRef strategy instead resolving the token */
15
+ forwardRefToken?: ForwardRefInjectionToken;
16
+ /** whether injection is optional if token is not registered. Set by optional decorator */
17
+ optional?: boolean;
18
+ /** mapper to map resolved value */
19
+ mapper?: Mapper;
20
+ /** provider to get resolve argument */
21
+ resolveArgumentProvider?: ArgumentProvider;
22
+ /** if defined, map the resolve argument and use the returned value as the value to inject */
23
+ injectArgumentMapper?: Mapper;
24
+ /** if defined, use the provided argument, map it and pass it to the resolution of the token */
25
+ forwardArgumentMapper?: Mapper;
26
+ };
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+ var type_info_exports = {};
16
+ module.exports = __toCommonJS(type_info_exports);
@@ -0,0 +1,43 @@
1
+ import type { Record } from '../types.js';
2
+ import type { Injector } from './injector.js';
3
+ import type { ResolveArgument } from './interfaces.js';
4
+ import type { InjectionToken } from './token.js';
5
+ /**
6
+ * transient: new resolution for every resolve
7
+ * resolution: one resolution per resolve tree
8
+ * injector: one resolution per injector
9
+ * singleton: one resolution at injector where token is registered
10
+ */
11
+ export type Lifecycle = 'transient' | 'resolution' | 'injector' | 'singleton';
12
+ export type ResolveContext = Pick<Injector, 'resolve' | 'resolveAll'>;
13
+ export type Mapper<T = any, U = unknown> = (value: T) => U;
14
+ export type ArgumentProvider<T = unknown> = (context: ResolveContext) => T;
15
+ export type ForwardRefInjectionToken<T = any, A = any> = Exclude<InjectionToken<T, A>, Function> | (() => InjectionToken<T, A>);
16
+ export type ResolveOptions = {
17
+ optional?: boolean;
18
+ skipSelf?: boolean;
19
+ onlySelf?: boolean;
20
+ };
21
+ export type RegistrationOptions<T, A = unknown> = {
22
+ lifecycle?: Lifecycle;
23
+ /** Default resolve argument used when neither token nor explicit resolve argument is provided */
24
+ defaultArgument?: ResolveArgument<T, A>;
25
+ /** Default resolve argument used when neither token nor explicit resolve argument is provided */
26
+ defaultArgumentProvider?: ArgumentProvider<ResolveArgument<T, A>>;
27
+ /**
28
+ * Value to distinguish scoped and singleton instances based on argument
29
+ * by default it uses strict equality (===) on the original argument,
30
+ * so modifications to argument objects and literal objects in the call
31
+ * may not yield the expected result.
32
+ *
33
+ * Hint: {@link JSON.stringify} is a simple solution for many use cases,
34
+ * but will fail if properties have different order
35
+ */
36
+ argumentIdentityProvider?: Mapper<ResolveArgument<T, A>>;
37
+ /** Function which gets called after a resolve */
38
+ afterResolve?: (instance: T, argument: ResolveArgument<T, A>) => any;
39
+ /** Whether multiple values can be resolved or not (used with {@link Injector.resolveAll}). If false, previous registrations are removed */
40
+ multi?: boolean;
41
+ /** Custom metadata */
42
+ metadata?: Record;
43
+ };
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+ var types_exports = {};
16
+ module.exports = __toCommonJS(types_exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tstdl/base",
3
- "version": "0.85.14",
3
+ "version": "0.85.16",
4
4
  "author": "Patrick Hein",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -23,7 +23,7 @@
23
23
  "luxon": "^3.3",
24
24
  "reflect-metadata": "^0.1",
25
25
  "rxjs": "^7.8",
26
- "type-fest": "^3.12"
26
+ "type-fest": "^4.0"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@types/chroma-js": "2.4",
@@ -33,11 +33,11 @@
33
33
  "@types/mjml": "4.7",
34
34
  "@types/node": "20",
35
35
  "@types/nodemailer": "6.4",
36
- "@typescript-eslint/eslint-plugin": "5.61",
37
- "@typescript-eslint/parser": "5.61",
36
+ "@typescript-eslint/eslint-plugin": "6.2",
37
+ "@typescript-eslint/parser": "6.2",
38
38
  "concurrently": "8.2",
39
39
  "esbuild": "0.18",
40
- "eslint": "8.44",
40
+ "eslint": "8.45",
41
41
  "eslint-import-resolver-typescript": "3.5",
42
42
  "eslint-plugin-import": "2.27",
43
43
  "tsc-alias": "1.8",
@@ -54,15 +54,15 @@
54
54
  "@zxcvbn-ts/language-en": "^3.0",
55
55
  "chroma-js": "^2.4",
56
56
  "handlebars": "^4.7",
57
- "knex": "^2.4",
57
+ "knex": "^2.5",
58
58
  "koa": "^2.14",
59
59
  "minio": "^7.1",
60
60
  "mjml": "^4.14",
61
61
  "mongodb": "^5.7",
62
62
  "nodemailer": "^6.9",
63
- "playwright": "^1.35",
64
- "preact": "^10.15",
65
- "preact-render-to-string": "^6.1",
63
+ "playwright": "^1.36",
64
+ "preact": "^10.16",
65
+ "preact-render-to-string": "^6.2",
66
66
  "undici": "^5.22",
67
67
  "urlpattern-polyfill": "^9.0"
68
68
  },
package/pool/pool.js CHANGED
@@ -22,7 +22,7 @@ __export(pool_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(pool_exports);
24
24
  var import_array_list = require("../data-structures/array-list.js");
25
- var import_set = require("../data-structures/set.js");
25
+ var import_set_collection = require("../data-structures/set-collection.js");
26
26
  var import_disposable = require("../disposable/disposable.js");
27
27
  var import_environment = require("../environment.js");
28
28
  var import_type_guards = require("../utils/type-guards.js");
@@ -46,7 +46,7 @@ class Pool {
46
46
  this.logger = logger;
47
47
  this.disposeOnError = options?.disposeOnError ?? false;
48
48
  this.freeInstances = new import_array_list.ArrayList();
49
- this.usedInstances = new import_set.Set();
49
+ this.usedInstances = new import_set_collection.SetCollection();
50
50
  this.placeholderInstances = 0;
51
51
  this.disposed = false;
52
52
  }
@@ -298,7 +298,7 @@ function isUndefined(value) {
298
298
  return value === void 0;
299
299
  }
300
300
  function isDefined(value) {
301
- return !isUndefined(value);
301
+ return value !== void 0;
302
302
  }
303
303
  function assertUndefined(value, message = "Expected value to be undefined.") {
304
304
  assert(isUndefined(value), message);
@@ -318,7 +318,7 @@ function isNull(value) {
318
318
  return value === null;
319
319
  }
320
320
  function isNotNull(value) {
321
- return !isNull(value);
321
+ return value !== null;
322
322
  }
323
323
  function assertNull(value, message = "Expected value to be null.") {
324
324
  assert(isNull(value), message);