@tstdl/base 0.92.167 → 0.92.168

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 (307) hide show
  1. package/application/application.d.ts +12 -18
  2. package/application/application.js +48 -69
  3. package/application/index.d.ts +1 -5
  4. package/application/index.js +1 -5
  5. package/application/providers.d.ts +10 -0
  6. package/application/providers.js +54 -0
  7. package/authentication/client/authentication.service.d.ts +1 -3
  8. package/authentication/client/authentication.service.js +4 -5
  9. package/browser/browser-context-controller.d.ts +2 -4
  10. package/browser/browser-context-controller.js +5 -6
  11. package/browser/browser-controller.d.ts +2 -4
  12. package/browser/browser-controller.js +3 -4
  13. package/browser/browser.service.d.ts +1 -3
  14. package/browser/browser.service.js +1 -2
  15. package/browser/page-controller.d.ts +2 -4
  16. package/browser/page-controller.js +7 -8
  17. package/browser/utils.js +3 -3
  18. package/cancellation/token.d.ts +104 -41
  19. package/cancellation/token.js +125 -54
  20. package/core.d.ts +1 -13
  21. package/core.js +1 -46
  22. package/disposable/disposable.d.ts +0 -8
  23. package/disposable/disposable.js +1 -3
  24. package/disposable/index.d.ts +0 -6
  25. package/disposable/index.js +0 -6
  26. package/disposable/using.d.ts +0 -1
  27. package/disposable/using.js +2 -3
  28. package/distributed-loop/distributed-loop.js +2 -2
  29. package/errors/utils.js +4 -1
  30. package/examples/api/authentication.js +11 -5
  31. package/examples/api/basic-overview.js +17 -12
  32. package/examples/api/custom-authentication.js +13 -7
  33. package/examples/api/streaming.js +15 -12
  34. package/examples/browser/basic.js +6 -3
  35. package/examples/document-management/main.js +6 -3
  36. package/examples/http/client.js +7 -3
  37. package/examples/mail/basic.js +9 -7
  38. package/examples/pdf/basic.js +8 -6
  39. package/examples/template/basic.js +7 -5
  40. package/http/client/http-client-request.d.ts +1 -2
  41. package/http/client/http-client-request.js +1 -2
  42. package/http/server/http-server.d.ts +1 -3
  43. package/http/server/http-server.js +0 -1
  44. package/http/server/node/node-http-server.d.ts +1 -2
  45. package/http/server/node/node-http-server.js +1 -2
  46. package/import.js +1 -1
  47. package/injector/injector.d.ts +1 -1
  48. package/injector/types.d.ts +3 -4
  49. package/lock/lock.d.ts +40 -21
  50. package/lock/lock.js +74 -1
  51. package/lock/postgres/drizzle/0000_busy_tattoo.sql +7 -0
  52. package/lock/postgres/drizzle/meta/0000_snapshot.json +65 -0
  53. package/lock/postgres/drizzle/meta/_journal.json +13 -0
  54. package/lock/postgres/drizzle.config.js +11 -0
  55. package/lock/postgres/index.d.ts +2 -0
  56. package/lock/postgres/index.js +2 -0
  57. package/lock/postgres/lock.d.ts +14 -0
  58. package/lock/postgres/lock.js +127 -0
  59. package/lock/postgres/models/index.d.ts +2 -0
  60. package/lock/postgres/models/index.js +2 -0
  61. package/lock/postgres/models/lock.model.d.ts +7 -0
  62. package/{examples/orm/user.model.js → lock/postgres/models/lock.model.js} +22 -30
  63. package/lock/postgres/models/schemas.d.ts +3 -0
  64. package/lock/postgres/models/schemas.js +4 -0
  65. package/lock/postgres/module.d.ts +6 -0
  66. package/lock/postgres/module.js +26 -0
  67. package/lock/postgres/provider.d.ts +6 -0
  68. package/lock/postgres/provider.js +29 -0
  69. package/lock/provider.d.ts +12 -2
  70. package/lock/provider.js +24 -1
  71. package/lock/web/web-lock.d.ts +4 -3
  72. package/lock/web/web-lock.js +49 -42
  73. package/lock/web/web-lock.provider.d.ts +0 -3
  74. package/lock/web/web-lock.provider.js +5 -22
  75. package/logger/formatter.d.ts +13 -0
  76. package/logger/formatter.js +3 -0
  77. package/logger/formatters/index.d.ts +2 -0
  78. package/logger/formatters/index.js +2 -0
  79. package/logger/formatters/json.d.ts +5 -0
  80. package/logger/formatters/json.js +33 -0
  81. package/logger/formatters/pretty-print.d.ts +5 -0
  82. package/logger/formatters/pretty-print.js +55 -0
  83. package/logger/index.d.ts +5 -2
  84. package/logger/index.js +5 -2
  85. package/logger/level.d.ts +10 -8
  86. package/logger/level.js +9 -9
  87. package/logger/logger.d.ts +21 -30
  88. package/logger/logger.js +98 -26
  89. package/logger/manager.d.ts +20 -0
  90. package/logger/manager.js +77 -0
  91. package/logger/tokens.d.ts +1 -1
  92. package/logger/tokens.js +1 -1
  93. package/logger/transport.d.ts +14 -0
  94. package/logger/transport.js +16 -0
  95. package/logger/transports/console.d.ts +14 -0
  96. package/logger/transports/console.js +36 -0
  97. package/logger/transports/index.d.ts +1 -0
  98. package/logger/transports/index.js +1 -0
  99. package/mail/clients/nodemailer.mail-client.d.ts +0 -1
  100. package/mail/clients/nodemailer.mail-client.js +9 -7
  101. package/message-bus/local/local-message-bus.js +2 -2
  102. package/message-bus/message-bus-base.d.ts +2 -3
  103. package/message-bus/message-bus-base.js +5 -6
  104. package/message-bus/message-bus.d.ts +1 -2
  105. package/message-bus/message-bus.js +1 -2
  106. package/module/index.d.ts +0 -2
  107. package/module/index.js +0 -2
  108. package/module/module.d.ts +17 -18
  109. package/module/module.js +47 -12
  110. package/module/modules/function.module.d.ts +6 -6
  111. package/module/modules/function.module.js +25 -9
  112. package/module/modules/web-server.module.d.ts +2 -10
  113. package/module/modules/web-server.module.js +3 -11
  114. package/openid-connect/index.d.ts +0 -2
  115. package/openid-connect/index.js +0 -2
  116. package/openid-connect/oidc-state.model.d.ts +4 -5
  117. package/openid-connect/oidc-state.model.js +51 -1
  118. package/openid-connect/oidc.service-model.d.ts +1 -1
  119. package/openid-connect/oidc.service.d.ts +2 -6
  120. package/openid-connect/oidc.service.js +24 -37
  121. package/orm/decorators.d.ts +10 -1
  122. package/orm/decorators.js +8 -0
  123. package/orm/server/repository.d.ts +3 -1
  124. package/orm/server/repository.js +32 -3
  125. package/package.json +17 -28
  126. package/pdf/pdf.service.js +9 -9
  127. package/pool/pool.d.ts +1 -3
  128. package/pool/pool.js +3 -4
  129. package/queue/postgres/job.model.d.ts +1 -2
  130. package/queue/postgres/job.model.js +1 -2
  131. package/queue/postgres/module.js +1 -1
  132. package/threading/thread-pool.d.ts +1 -3
  133. package/threading/thread-pool.js +7 -8
  134. package/utils/format-error.d.ts +7 -0
  135. package/utils/format-error.js +59 -17
  136. package/utils/index.d.ts +1 -0
  137. package/utils/index.js +1 -0
  138. package/utils/object/dereference.d.ts +51 -19
  139. package/utils/object/dereference.js +52 -43
  140. package/utils/timing.js +2 -2
  141. package/utils/try-chain.d.ts +22 -0
  142. package/utils/try-chain.js +46 -0
  143. package/database/entity-repository.d.ts +0 -50
  144. package/database/entity-repository.js +0 -3
  145. package/database/entity.d.ts +0 -7
  146. package/database/entity.js +0 -1
  147. package/database/id.d.ts +0 -1
  148. package/database/id.js +0 -9
  149. package/database/index.d.ts +0 -11
  150. package/database/index.js +0 -11
  151. package/database/module.d.ts +0 -8
  152. package/database/module.js +0 -11
  153. package/database/mongo/classes.d.ts +0 -21
  154. package/database/mongo/classes.js +0 -26
  155. package/database/mongo/index.d.ts +0 -15
  156. package/database/mongo/index.js +0 -15
  157. package/database/mongo/model/document.d.ts +0 -29
  158. package/database/mongo/model/document.js +0 -63
  159. package/database/mongo/model/index.d.ts +0 -1
  160. package/database/mongo/model/index.js +0 -1
  161. package/database/mongo/module.d.ts +0 -8
  162. package/database/mongo/module.js +0 -68
  163. package/database/mongo/mongo-base.repository.d.ts +0 -103
  164. package/database/mongo/mongo-base.repository.js +0 -263
  165. package/database/mongo/mongo-bulk.d.ts +0 -35
  166. package/database/mongo/mongo-bulk.js +0 -90
  167. package/database/mongo/mongo-entity-repository.d.ts +0 -98
  168. package/database/mongo/mongo-entity-repository.js +0 -278
  169. package/database/mongo/operations.d.ts +0 -10
  170. package/database/mongo/operations.js +0 -54
  171. package/database/mongo/query-converter.d.ts +0 -6
  172. package/database/mongo/query-converter.js +0 -83
  173. package/database/mongo/simple-entity-repository.d.ts +0 -7
  174. package/database/mongo/simple-entity-repository.js +0 -6
  175. package/database/mongo/types.d.ts +0 -50
  176. package/database/mongo/types.js +0 -3
  177. package/database/query.d.ts +0 -121
  178. package/database/query.js +0 -7
  179. package/database/utils.d.ts +0 -2
  180. package/database/utils.js +0 -3
  181. package/disposable/async-disposer.d.ts +0 -35
  182. package/disposable/async-disposer.js +0 -125
  183. package/examples/orm/drizzle.config.js +0 -6
  184. package/examples/orm/schemas.d.ts +0 -3
  185. package/examples/orm/schemas.js +0 -4
  186. package/examples/orm/test.d.ts +0 -1
  187. package/examples/orm/test.js +0 -11
  188. package/examples/orm/user.model.d.ts +0 -13
  189. package/key-value-store/mongo/index.d.ts +0 -6
  190. package/key-value-store/mongo/index.js +0 -6
  191. package/key-value-store/mongo/module.d.ts +0 -8
  192. package/key-value-store/mongo/module.js +0 -18
  193. package/key-value-store/mongo/mongo-key-value-store.provider.d.ts +0 -8
  194. package/key-value-store/mongo/mongo-key-value-store.provider.js +0 -26
  195. package/key-value-store/mongo/mongo-key-value.model.d.ts +0 -7
  196. package/key-value-store/mongo/mongo-key-value.model.js +0 -1
  197. package/key-value-store/mongo/mongo-key-value.repository.d.ts +0 -10
  198. package/key-value-store/mongo/mongo-key-value.repository.js +0 -31
  199. package/key-value-store/mongo/mongo-key-value.store.d.ts +0 -15
  200. package/key-value-store/mongo/mongo-key-value.store.js +0 -82
  201. package/key-value-store/mongo/tokens.d.ts +0 -3
  202. package/key-value-store/mongo/tokens.js +0 -2
  203. package/lock/mongo/index.d.ts +0 -5
  204. package/lock/mongo/index.js +0 -5
  205. package/lock/mongo/lock.d.ts +0 -14
  206. package/lock/mongo/lock.js +0 -125
  207. package/lock/mongo/model.d.ts +0 -6
  208. package/lock/mongo/model.js +0 -1
  209. package/lock/mongo/module.d.ts +0 -12
  210. package/lock/mongo/module.js +0 -20
  211. package/lock/mongo/mongo-lock-repository.d.ts +0 -14
  212. package/lock/mongo/mongo-lock-repository.js +0 -67
  213. package/lock/mongo/provider.d.ts +0 -8
  214. package/lock/mongo/provider.js +0 -36
  215. package/logger/console/index.d.ts +0 -1
  216. package/logger/console/index.js +0 -1
  217. package/logger/console/logger.d.ts +0 -11
  218. package/logger/console/logger.js +0 -64
  219. package/logger/noop/index.d.ts +0 -1
  220. package/logger/noop/index.js +0 -1
  221. package/logger/noop/logger.d.ts +0 -9
  222. package/logger/noop/logger.js +0 -21
  223. package/migration/index.d.ts +0 -9
  224. package/migration/index.js +0 -9
  225. package/migration/migration-state-repository.d.ts +0 -4
  226. package/migration/migration-state-repository.js +0 -3
  227. package/migration/migration-state.d.ts +0 -6
  228. package/migration/migration-state.js +0 -1
  229. package/migration/migrator.d.ts +0 -23
  230. package/migration/migrator.js +0 -76
  231. package/migration/mongo/index.d.ts +0 -2
  232. package/migration/mongo/index.js +0 -2
  233. package/migration/mongo/migration-state-repository.d.ts +0 -11
  234. package/migration/mongo/migration-state-repository.js +0 -32
  235. package/migration/mongo/module.d.ts +0 -12
  236. package/migration/mongo/module.js +0 -17
  237. package/module/module-base.d.ts +0 -18
  238. package/module/module-base.js +0 -40
  239. package/module/module-metric-reporter.d.ts +0 -29
  240. package/module/module-metric-reporter.js +0 -62
  241. package/openid-connect/mongo-oidc-state.repository.d.ts +0 -21
  242. package/openid-connect/mongo-oidc-state.repository.js +0 -52
  243. package/openid-connect/oidc-state.repository.d.ts +0 -4
  244. package/openid-connect/oidc-state.repository.js +0 -3
  245. package/process-shutdown.d.ts +0 -9
  246. package/process-shutdown.js +0 -65
  247. package/queue/mongo/index.d.ts +0 -4
  248. package/queue/mongo/index.js +0 -4
  249. package/queue/mongo/job.d.ts +0 -12
  250. package/queue/mongo/job.js +0 -1
  251. package/queue/mongo/mongo-job.repository.d.ts +0 -13
  252. package/queue/mongo/mongo-job.repository.js +0 -54
  253. package/queue/mongo/queue.d.ts +0 -38
  254. package/queue/mongo/queue.js +0 -266
  255. package/queue/mongo/queue.provider.d.ts +0 -18
  256. package/queue/mongo/queue.provider.js +0 -38
  257. package/search-index/elastic/config.d.ts +0 -8
  258. package/search-index/elastic/config.js +0 -26
  259. package/search-index/elastic/index.d.ts +0 -8
  260. package/search-index/elastic/index.js +0 -8
  261. package/search-index/elastic/keyword-rewriter.d.ts +0 -8
  262. package/search-index/elastic/keyword-rewriter.js +0 -18
  263. package/search-index/elastic/model/elastic-query.d.ts +0 -16
  264. package/search-index/elastic/model/elastic-query.js +0 -1
  265. package/search-index/elastic/model/index-mapping.d.ts +0 -26
  266. package/search-index/elastic/model/index-mapping.js +0 -4
  267. package/search-index/elastic/model/index.d.ts +0 -3
  268. package/search-index/elastic/model/index.js +0 -3
  269. package/search-index/elastic/model/sort.d.ts +0 -8
  270. package/search-index/elastic/model/sort.js +0 -1
  271. package/search-index/elastic/module.d.ts +0 -10
  272. package/search-index/elastic/module.js +0 -49
  273. package/search-index/elastic/query-builder/boolean-query-builder.d.ts +0 -11
  274. package/search-index/elastic/query-builder/boolean-query-builder.js +0 -52
  275. package/search-index/elastic/query-builder/index.d.ts +0 -1
  276. package/search-index/elastic/query-builder/index.js +0 -1
  277. package/search-index/elastic/query-converter.d.ts +0 -9
  278. package/search-index/elastic/query-converter.js +0 -183
  279. package/search-index/elastic/search-index.d.ts +0 -30
  280. package/search-index/elastic/search-index.js +0 -144
  281. package/search-index/elastic/sort-converter.d.ts +0 -4
  282. package/search-index/elastic/sort-converter.js +0 -14
  283. package/search-index/elastic/types.d.ts +0 -5
  284. package/search-index/elastic/types.js +0 -1
  285. package/search-index/error.d.ts +0 -10
  286. package/search-index/error.js +0 -14
  287. package/search-index/index.d.ts +0 -3
  288. package/search-index/index.js +0 -3
  289. package/search-index/memory/index.d.ts +0 -1
  290. package/search-index/memory/index.js +0 -1
  291. package/search-index/memory/memory-search-index.d.ts +0 -19
  292. package/search-index/memory/memory-search-index.js +0 -144
  293. package/search-index/search-index.d.ts +0 -46
  294. package/search-index/search-index.js +0 -31
  295. package/search-index/search-result.d.ts +0 -12
  296. package/search-index/search-result.js +0 -1
  297. package/theme/adapters/css-adapter.d.ts +0 -5
  298. package/theme/adapters/css-adapter.js +0 -29
  299. package/theme/adapters/index.d.ts +0 -2
  300. package/theme/adapters/index.js +0 -2
  301. package/theme/adapters/tailwind-adapter.d.ts +0 -18
  302. package/theme/adapters/tailwind-adapter.js +0 -32
  303. package/theme/index.d.ts +0 -1
  304. package/theme/index.js +0 -1
  305. package/theme/theme-service.d.ts +0 -43
  306. package/theme/theme-service.js +0 -128
  307. /package/{examples/orm → lock/postgres}/drizzle.config.d.ts +0 -0
@@ -8,8 +8,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
10
  import { Index, Table } from '../../orm/decorators.js';
11
- import { EntityWithoutMetadata } from '../../orm/entity.js';
12
- import { Integer, Json, Timestamp } from '../../orm/index.js';
11
+ import { EntityWithoutMetadata, Integer, Json, Timestamp } from '../../orm/index.js';
13
12
  import { StringProperty } from '../../schema/index.js';
14
13
  let PostgresJob = class PostgresJob extends EntityWithoutMetadata {
15
14
  queue;
@@ -24,6 +24,6 @@ export async function migratePostgresQueueSchema() {
24
24
  await migrate(database, {
25
25
  migrationsSchema: 'queue',
26
26
  migrationsTable: '_migrations',
27
- migrationsFolder: import.meta.resolve('./drizzle').replace('file://', '')
27
+ migrationsFolder: import.meta.resolve('./drizzle').replace('file://', ''),
28
28
  });
29
29
  }
@@ -1,7 +1,5 @@
1
1
  import type * as NodeWorkerThreads from 'node:worker_threads';
2
2
  import type { LiteralUnion } from 'type-fest';
3
- import type { AsyncDisposable } from '../disposable/index.js';
4
- import { disposeAsync } from '../disposable/index.js';
5
3
  import type { Logger } from '../logger/index.js';
6
4
  import type { ThreadWorker } from './thread-worker.js';
7
5
  export type ThreadOptions = (WorkerOptions | NodeWorkerThreads.WorkerOptions) & {
@@ -13,7 +11,7 @@ export declare class ThreadPool implements AsyncDisposable {
13
11
  readonly options: ThreadOptions | undefined;
14
12
  constructor(url: string | URL, logger: Logger, options?: ThreadOptions);
15
13
  dispose(): Promise<void>;
16
- [disposeAsync](): Promise<void>;
14
+ [Symbol.asyncDispose](): Promise<void>;
17
15
  getProcessor<T extends ThreadWorker>(name?: string): (...args: Parameters<T>) => Promise<ReturnType<T>>;
18
16
  process<T extends ThreadWorker>(name: LiteralUnion<'default', string>, ...args: Parameters<T>): Promise<ReturnType<T>>;
19
17
  private spawn;
@@ -1,4 +1,3 @@
1
- import { disposeAsync } from '../disposable/index.js';
2
1
  import { isNode } from '../environment.js';
3
2
  import { dynamicImport } from '../import.js';
4
3
  import { Pool } from '../pool/index.js';
@@ -9,7 +8,7 @@ if (isNode) {
9
8
  spawnWorker = async (url, options) => {
10
9
  const workerThreads = await dynamicImport('node:worker_threads');
11
10
  spawnWorker = () => new workerThreads.Worker(url, options);
12
- return spawnWorker(url, options);
11
+ return await spawnWorker(url, options);
13
12
  };
14
13
  }
15
14
  else {
@@ -22,26 +21,26 @@ export class ThreadPool {
22
21
  constructor(url, logger, options) {
23
22
  this.url = url;
24
23
  this.options = options;
25
- this.pool = new Pool(async () => this.spawn(), async ({ worker }) => worker.terminate(), logger, { size: options?.threadCount });
24
+ this.pool = new Pool(async () => await this.spawn(), async ({ worker }) => await worker.terminate(), logger, { size: options?.threadCount });
26
25
  }
27
26
  async dispose() {
28
- return this[disposeAsync]();
27
+ await this[Symbol.asyncDispose]();
29
28
  }
30
- async [disposeAsync]() {
29
+ async [Symbol.asyncDispose]() {
31
30
  await this.pool.dispose();
32
31
  }
33
32
  getProcessor(name = 'default') {
34
- const processor = async (...args) => this.process(name, ...args);
33
+ const processor = async (...args) => await this.process(name, ...args);
35
34
  return processor;
36
35
  }
37
36
  async process(name, ...args) {
38
- return this.pool.use(async (entry) => {
37
+ return await this.pool.use(async (entry) => {
39
38
  if (!entry.remotes.has(name)) {
40
39
  const rpcEndpoint = MessagePortRpcEndpoint.from(entry.worker);
41
40
  const remote = await Rpc.connect(rpcEndpoint, `thread-worker:${name}`);
42
41
  entry.remotes.set(name, remote);
43
42
  }
44
- return entry.remotes.get(name)(...args);
43
+ return await entry.remotes.get(name)(...args);
45
44
  });
46
45
  }
47
46
  async spawn() {
@@ -16,9 +16,16 @@ export type FormatErrorOptions = {
16
16
  * Include stack trace
17
17
  */
18
18
  includeStack?: boolean;
19
+ /**
20
+ * Maximum recursion depth for nested causes and aggregate errors (default: 5)
21
+ */
22
+ depth?: number;
19
23
  };
20
24
  export interface ErrorExtraInfo {
21
25
  /** Format extra data (without message and stack) as JSON */
22
26
  getExtraInfo(): UndefinableJson | undefined;
23
27
  }
28
+ /**
29
+ * Enhanced error formatting
30
+ */
24
31
  export declare function formatError(error: any, options?: FormatErrorOptions): string;
@@ -1,35 +1,77 @@
1
1
  import { unwrapError } from '../errors/utils.js';
2
2
  import { decycle } from './object/decycle.js';
3
3
  import { objectKeys } from './object/object.js';
4
- import { isDefined, isFunction, isUndefined } from './type-guards.js';
4
+ import { tryChain } from './try-chain.js';
5
+ import { isDefined, isFunction, isObject, isUndefined } from './type-guards.js';
6
+ /**
7
+ * Enhanced error formatting
8
+ */
5
9
  export function formatError(error, options = {}) {
6
- const { includeRest = 'if-no-extra-info', includeExtraInfo = true, includeStack = true } = options;
10
+ const { includeName = true, includeRest = 'if-no-extra-info', includeExtraInfo = true, includeStack = true, depth = 5, } = options;
11
+ if (depth <= 0) {
12
+ return '[Max recursion depth reached]';
13
+ }
14
+ const actualError = unwrapError(error);
7
15
  let name;
8
16
  let message;
9
17
  let stack;
10
18
  let rest;
11
19
  let extraInfo;
12
- const actualError = unwrapError(error);
13
- if ((actualError instanceof Error)) {
14
- ({ name, message, stack, ...rest } = actualError);
15
- // eslint-disable-next-line @typescript-eslint/unbound-method
16
- if (includeExtraInfo && isFunction(actualError.getExtraInfo)) {
20
+ let cause;
21
+ let aggregateErrors;
22
+ if (isObject(actualError)) {
23
+ if (actualError instanceof Error) {
24
+ ({ name, message, stack, cause, ...rest } = actualError);
25
+ if (actualError instanceof AggregateError) {
26
+ aggregateErrors = actualError.errors;
27
+ }
28
+ }
29
+ else {
30
+ // Handle plain objects that might have error-like properties
31
+ ({ name, message, stack, cause, ...rest } = actualError);
32
+ }
33
+ // Check for extra info (duck-typing)
34
+ if (includeExtraInfo && isFunction(actualError.getExtraInfo)) { // eslint-disable-line @typescript-eslint/unbound-method
17
35
  extraInfo = actualError.getExtraInfo();
18
36
  }
19
37
  }
20
- if (isUndefined(name) && (isUndefined(message) || message.trim().length == 0)) {
21
- try {
22
- const decycledError = decycle(actualError);
23
- message = JSON.stringify(decycledError, null, 2);
38
+ // If no message, serialize the whole object as a fallback
39
+ if (isUndefined(message) || String(message).trim().length === 0) { // eslint-disable-line @typescript-eslint/no-unnecessary-type-conversion
40
+ // Handle primitives directly
41
+ if (!isObject(actualError)) {
42
+ message = String(actualError);
24
43
  }
25
- catch {
26
- throw actualError;
44
+ else {
45
+ message = tryChain([
46
+ () => JSON.stringify(actualError, null, 2), // Try normal serialization first
47
+ () => {
48
+ // Fallback with decycle for objects with circular references
49
+ const decycledError = decycle(actualError);
50
+ return JSON.stringify(decycledError, null, 2);
51
+ },
52
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
53
+ () => `[Unstringifiable object: ${String(actualError)}]`, // Safe fallback if JSON.stringify still fails
54
+ ]);
27
55
  }
28
56
  }
29
- const nameString = (options.includeName ?? true) ? `${name ?? 'Error'}: ` : '';
30
- const decycledRest = isDefined(rest) ? decycle(rest) : undefined;
31
- const restString = (((includeRest == true) || ((includeRest == 'if-no-extra-info') && isUndefined(extraInfo))) && isDefined(decycledRest) && (objectKeys(rest ?? {}).length > 0)) ? `\n${JSON.stringify(decycledRest, null, 2)}` : '';
57
+ // --- String Assembly ---
58
+ const nameString = includeName ? `${name ?? 'Error'}: ` : '';
59
+ let restString = '';
60
+ const shouldIncludeRest = (includeRest == true) || (includeRest == 'if-no-extra-info' && isUndefined(extraInfo));
61
+ if (shouldIncludeRest && isDefined(rest) && objectKeys(rest).length > 0) {
62
+ restString = `\n${JSON.stringify(decycle(rest), null, 2)}`;
63
+ }
32
64
  const extraInfoString = isDefined(extraInfo) ? `\n${JSON.stringify(extraInfo, null, 2)}` : '';
33
65
  const stackString = (includeStack && isDefined(stack)) ? `\n${stack}` : '';
34
- return `${nameString}${message}${restString}${extraInfoString}${stackString}`;
66
+ const causeString = includeStack && cause
67
+ ? formatNestedError('Caused by:', cause, { ...options, depth: depth - 1 })
68
+ : '';
69
+ const aggregateErrorsString = Array.isArray(aggregateErrors)
70
+ ? aggregateErrors.map((err, i) => formatNestedError(`Sub-error #${i + 1}:`, err, { ...options, depth: depth - 1 })).join('')
71
+ : '';
72
+ return `${nameString}${message}${restString}${extraInfoString}${stackString}${causeString}${aggregateErrorsString}`;
73
+ }
74
+ function formatNestedError(prefix, error, options) {
75
+ const formatted = formatError(error, options).replace(/\n/g, '\n ');
76
+ return `\n\n${prefix}\n ${formatted}`;
35
77
  }
package/utils/index.d.ts CHANGED
@@ -49,6 +49,7 @@ export * from './sort.js';
49
49
  export * from './throw.js';
50
50
  export * from './timer.js';
51
51
  export * from './timing.js';
52
+ export * from './try-chain.js';
52
53
  export * from './try-ignore.js';
53
54
  export * from './type-guards.js';
54
55
  export * from './type-of.js';
package/utils/index.js CHANGED
@@ -49,6 +49,7 @@ export * from './sort.js';
49
49
  export * from './throw.js';
50
50
  export * from './timer.js';
51
51
  export * from './timing.js';
52
+ export * from './try-chain.js';
52
53
  export * from './try-ignore.js';
53
54
  export * from './type-guards.js';
54
55
  export * from './type-of.js';
@@ -1,34 +1,66 @@
1
1
  import { type JsonPathInput } from '../../json-path/index.js';
2
+ type CachedDereferencer<TOptional extends boolean | undefined> = TOptional extends true ? (<T = unknown>(object: object, reference: JsonPathInput) => T | undefined) : (<T = unknown>(object: object, reference: JsonPathInput) => T);
2
3
  export type DereferenceOptions = {
4
+ /**
5
+ * If true, the dereferencer will not throw an error if an intermediate
6
+ * property is null or undefined, and will return `undefined` instead.
7
+ * @default false
8
+ */
3
9
  optional?: boolean;
10
+ /**
11
+ * Method to use for dereferencing.
12
+ * - 'loop': Uses a simple loop to traverse the object. More robust, works in all environments.
13
+ * - 'function': Dynamically generates a function for dereferencing. Slow to compile, but faster at runtime - may not work in all environments. Automatically falls back to 'loop' if generation fails.
14
+ *
15
+ * @default 'loop' for `dereference`; 'function' for `compileDereferencer` and `getCachedDereference`
16
+ */
17
+ method?: 'loop' | 'function';
4
18
  };
5
19
  /**
6
- * Compiles a dereferencer for a specific reference
7
- * @param object object to dereference
8
- * @param reference path to property in dot notation or {@link JsonPath}
9
- * @returns referenced value
20
+ * Compiles a dereferencer for a specific reference path.
21
+ * This is the most performant option if you need to access the same path on many different objects.
22
+ *
23
+ * @param reference - Path to a property, e.g., 'a.b.c' or ['a', 'b', 'c'].
24
+ * @param options - Dereferencing options.
25
+ * @returns A specialized function to retrieve a value from an object.
10
26
  */
11
- export declare function compileDereferencer(reference: JsonPathInput, options?: DereferenceOptions): (object: object) => unknown;
27
+ export declare function compileDereferencer<T = unknown>(reference: JsonPathInput, options: DereferenceOptions & {
28
+ optional: true;
29
+ }): (object: object) => T | undefined;
30
+ export declare function compileDereferencer<T = unknown>(reference: JsonPathInput, options?: DereferenceOptions): (object: object) => T;
12
31
  /**
13
- * Dereference a reference
32
+ * Dereferences a value from an object using a reference path.
14
33
  *
15
- * @description useful if you dereference a reference a few times at most
34
+ * @description
35
+ * Best for one-off use. For repeated access, use `compileDereferencer` or `getCachedDereference`.
16
36
  *
17
- * also take a look at {@link getCachedDereference} and {@link compileDereferencer} if you need to dereference multiple times
18
- * @param object object to dereference
19
- * @param reference path to property in dot notation or {@link JsonPath}
20
- * @returns referenced value
37
+ * @param object - The object to access.
38
+ * @param reference - Path to a property, e.g., 'a.b.c' or ['a', 'b', 'c'].
39
+ * @param options - Dereferencing options.
40
+ * @returns The referenced value.
21
41
  */
22
- export declare function dereference(object: object, reference: JsonPathInput, options?: DereferenceOptions): unknown;
42
+ export declare function dereference<T = unknown>(object: object, reference: JsonPathInput, options: DereferenceOptions & {
43
+ optional: true;
44
+ }): T | undefined;
45
+ export declare function dereference<T = unknown>(object: object, reference: JsonPathInput, options?: DereferenceOptions): T;
23
46
  /**
24
- * Cached version of {@link dereference}. It caches the internally used dereferencer, but it does *not* cache the referenced value
47
+ * Returns a cached dereferencing function.
48
+ * The function caches the compiled dereferencer for each path, but not the resulting values.
25
49
  *
26
50
  * @description
27
- * useful if you dereference multiple references, each multiple times
51
+ * Ideal for applications that frequently access various, but repeating, paths on different objects.
52
+ *
53
+ * @example
54
+ * const optionalDeref = getCachedDereference({ optional: true });
55
+ * const value = optionalDeref(myObj, 'a.b.c'); // value is T | undefined
56
+ *
57
+ * const requiredDeref = getCachedDereference();
58
+ * const value2 = requiredDeref(myObj, 'a.b.c'); // value2 is T
28
59
  *
29
- * also take a look at {@link dereference} and {@link compileDereferencer} for other use cases
30
- * @param object object to dereference
31
- * @param reference path to property in dot notation or {@link JsonPath}
32
- * @returns referenced value
60
+ * @param options - Dereferencing options. These options are fixed for the lifetime of the returned function.
61
+ * @returns A function that takes an object and a reference and returns the value.
33
62
  */
34
- export declare function getCachedDereference(options?: DereferenceOptions): typeof dereference;
63
+ export declare function getCachedDereference<TOptional extends boolean | undefined>(options?: DereferenceOptions & {
64
+ optional: TOptional;
65
+ }): CachedDereferencer<TOptional>;
66
+ export {};
@@ -1,62 +1,71 @@
1
1
  import { JsonPath } from '../../json-path/index.js';
2
2
  import { memoizeSingle } from '../function/memoize.js';
3
- import { isNullOrUndefined } from '../type-guards.js';
4
- /**
5
- * Compiles a dereferencer for a specific reference
6
- * @param object object to dereference
7
- * @param reference path to property in dot notation or {@link JsonPath}
8
- * @returns referenced value
9
- */
10
- export function compileDereferencer(reference, options) {
11
- const nodes = JsonPath.from(reference).nodes;
12
- if (options?.optional == true) {
13
- return function optionalDereferencer(object) {
14
- let target = object;
15
- for (let i = 0; i < nodes.length; i++) { // eslint-disable-line @typescript-eslint/prefer-for-of
16
- if (isNullOrUndefined(target)) {
17
- return undefined;
18
- }
19
- target = target[nodes[i]];
20
- }
21
- return target;
22
- };
23
- }
3
+ import { isNullOrUndefined, isSymbol } from '../type-guards.js';
4
+ function compileLoopDereferencer(nodes, isOptional) {
24
5
  return function dereferencer(object) {
25
6
  let target = object;
26
7
  for (let i = 0; i < nodes.length; i++) { // eslint-disable-line @typescript-eslint/prefer-for-of
8
+ if (isOptional && isNullOrUndefined(target)) {
9
+ return undefined;
10
+ }
27
11
  target = target[nodes[i]];
28
12
  }
29
13
  return target;
30
14
  };
31
15
  }
32
- /**
33
- * Dereference a reference
34
- *
35
- * @description useful if you dereference a reference a few times at most
36
- *
37
- * also take a look at {@link getCachedDereference} and {@link compileDereferencer} if you need to dereference multiple times
38
- * @param object object to dereference
39
- * @param reference path to property in dot notation or {@link JsonPath}
40
- * @returns referenced value
41
- */
16
+ function compileFunctionDereferencer(nodes, isOptional) {
17
+ const accessor = isOptional
18
+ // Generates code like: obj?.['prop1']?.['prop2']
19
+ ? nodes.map((node) => `?.['${node.replace(/'/g, '\\\'')}']`).join('')
20
+ // Generates code like: obj['prop1']['prop2']
21
+ : nodes.map((node) => `['${node.replace(/'/g, '\\\'')}']`).join('');
22
+ const body = `
23
+ "use strict";
24
+ return object${accessor};
25
+ `;
26
+ return new Function('object', body);
27
+ }
28
+ export function compileDereferencer(reference, options) {
29
+ const nodes = JsonPath.from(reference).nodes;
30
+ const isOptional = options?.optional ?? false;
31
+ if (options?.method === 'loop') {
32
+ return compileLoopDereferencer(nodes, isOptional);
33
+ }
34
+ try {
35
+ for (const node of nodes) {
36
+ if (isSymbol(node)) {
37
+ throw new Error('Cannot compile function dereferencer for paths containing symbols');
38
+ }
39
+ }
40
+ return compileFunctionDereferencer(nodes, isOptional);
41
+ }
42
+ catch {
43
+ return compileLoopDereferencer(nodes, isOptional);
44
+ }
45
+ }
42
46
  export function dereference(object, reference, options) {
43
- return compileDereferencer(reference, options)(object);
47
+ return compileDereferencer(reference, { method: 'loop', ...options })(object);
44
48
  }
45
49
  /**
46
- * Cached version of {@link dereference}. It caches the internally used dereferencer, but it does *not* cache the referenced value
50
+ * Returns a cached dereferencing function.
51
+ * The function caches the compiled dereferencer for each path, but not the resulting values.
47
52
  *
48
53
  * @description
49
- * useful if you dereference multiple references, each multiple times
54
+ * Ideal for applications that frequently access various, but repeating, paths on different objects.
55
+ *
56
+ * @example
57
+ * const optionalDeref = getCachedDereference({ optional: true });
58
+ * const value = optionalDeref(myObj, 'a.b.c'); // value is T | undefined
50
59
  *
51
- * also take a look at {@link dereference} and {@link compileDereferencer} for other use cases
52
- * @param object object to dereference
53
- * @param reference path to property in dot notation or {@link JsonPath}
54
- * @returns referenced value
60
+ * const requiredDeref = getCachedDereference();
61
+ * const value2 = requiredDeref(myObj, 'a.b.c'); // value2 is T
62
+ *
63
+ * @param options - Dereferencing options. These options are fixed for the lifetime of the returned function.
64
+ * @returns A function that takes an object and a reference and returns the value.
55
65
  */
56
66
  export function getCachedDereference(options) {
57
- const memoizedDereferencer = memoizeSingle(compileDereferencer);
58
- function cachedDereference(object, reference) {
59
- return memoizedDereferencer(reference, options)(object);
60
- }
61
- return cachedDereference;
67
+ const memoizedCompiler = memoizeSingle((reference) => compileDereferencer(reference, options));
68
+ return function cachedDereference(object, reference) {
69
+ return memoizedCompiler(reference)(object);
70
+ };
62
71
  }
package/utils/timing.js CHANGED
@@ -29,8 +29,8 @@ export async function cancelableTimeout(milliseconds, cancelSignal) {
29
29
  }
30
30
  /** Timeout until specified time */
31
31
  export async function cancelableTimeoutUntil(timestamp, cancelSignal) {
32
- const left = timestamp.valueOf() - Date.now();
33
- return await cancelableTimeout(left, cancelSignal);
32
+ const millisecondsLeft = timestamp.valueOf() - Date.now();
33
+ return await cancelableTimeout(millisecondsLeft, cancelSignal);
34
34
  }
35
35
  export async function withTimeout(milliseconds, promiseOrProvider, options) {
36
36
  const abortController = new AbortController();
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Executes a series of functions (strategies) in order until one succeeds.
3
+ * If all strategies fail by throwing an error, the fallback function is executed.
4
+ *
5
+ * @template T The expected return type.
6
+ * @param strategies An array of functions to attempt, in order.
7
+ * @param fallback Optional function to execute if all strategies fail.
8
+ * @param onError Optional callback to handle/log errors from failing strategies.
9
+ * @returns The result of the first successful strategy or the fallback.
10
+ */
11
+ export declare function tryChain<T>(strategies: (() => T)[], onError?: (error: unknown, index: number) => void): T;
12
+ /**
13
+ * Executes a series of functions (strategies) in order until one succeeds.
14
+ * If all strategies fail by throwing an error, the fallback function is executed.
15
+ *
16
+ * @template T The expected return type.
17
+ * @param strategies An array of functions to attempt, in order.
18
+ * @param fallback Optional function to execute if all strategies fail.
19
+ * @param onError Optional callback to handle/log errors from failing strategies.
20
+ * @returns The result of the first successful strategy or the fallback.
21
+ */
22
+ export declare function tryChainAsync<T>(strategies: (() => T | Promise<T>)[], onError?: (error: unknown, index: number) => void): Promise<T>;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Executes a series of functions (strategies) in order until one succeeds.
3
+ * If all strategies fail by throwing an error, the fallback function is executed.
4
+ *
5
+ * @template T The expected return type.
6
+ * @param strategies An array of functions to attempt, in order.
7
+ * @param fallback Optional function to execute if all strategies fail.
8
+ * @param onError Optional callback to handle/log errors from failing strategies.
9
+ * @returns The result of the first successful strategy or the fallback.
10
+ */
11
+ export function tryChain(strategies, onError) {
12
+ const errors = [];
13
+ for (const [index, strategy] of strategies.entries()) {
14
+ try {
15
+ return strategy();
16
+ }
17
+ catch (error) {
18
+ errors.push(error);
19
+ onError?.(error, index);
20
+ }
21
+ }
22
+ throw new AggregateError(errors, 'All strategies failed and no fallback provided');
23
+ }
24
+ /**
25
+ * Executes a series of functions (strategies) in order until one succeeds.
26
+ * If all strategies fail by throwing an error, the fallback function is executed.
27
+ *
28
+ * @template T The expected return type.
29
+ * @param strategies An array of functions to attempt, in order.
30
+ * @param fallback Optional function to execute if all strategies fail.
31
+ * @param onError Optional callback to handle/log errors from failing strategies.
32
+ * @returns The result of the first successful strategy or the fallback.
33
+ */
34
+ export async function tryChainAsync(strategies, onError) {
35
+ const errors = [];
36
+ for (const [index, strategy] of strategies.entries()) {
37
+ try {
38
+ return await strategy();
39
+ }
40
+ catch (error) {
41
+ errors.push(error);
42
+ onError?.(error, index);
43
+ }
44
+ }
45
+ throw new AggregateError(errors, 'All strategies failed and no fallback provided');
46
+ }
@@ -1,50 +0,0 @@
1
- import type { Entity, MaybeNewEntity } from './entity.js';
2
- import type { Query, QueryOptions } from './query.js';
3
- export declare const repositoryType: unique symbol;
4
- export type UpdateOptions = {
5
- upsert?: boolean;
6
- };
7
- export type EntityPatch<T extends Entity = Entity> = Partial<Omit<T, 'id'>>;
8
- export declare abstract class EntityRepository<T extends Entity = Entity> {
9
- readonly [repositoryType]: T;
10
- abstract load<U extends T = T>(id: string): Promise<U>;
11
- abstract tryLoad<U extends T = T>(id: string): Promise<U | undefined>;
12
- abstract loadByFilter<U extends T = T>(query: Query<U>, options?: QueryOptions<U>): Promise<U>;
13
- abstract tryLoadByFilter<U extends T = T>(query: Query<U>, options?: QueryOptions<U>): Promise<U | undefined>;
14
- abstract loadMany<U extends T = T>(ids: string[], options?: QueryOptions<U>): Promise<U[]>;
15
- abstract loadManyCursor<U extends T = T>(ids: string[], options?: QueryOptions<U>): AsyncIterableIterator<U>;
16
- abstract loadManyByFilter<U extends T = T>(query: Query<U>, options?: QueryOptions<U>): Promise<U[]>;
17
- abstract loadManyByFilterCursor<U extends T = T>(query: Query<U>, options?: QueryOptions<U>): AsyncIterableIterator<U>;
18
- abstract loadAll<U extends T = T>(options?: QueryOptions<U>): Promise<U[]>;
19
- abstract loadAllCursor<U extends T = T>(options?: QueryOptions<U>): AsyncIterableIterator<U>;
20
- abstract loadAndDelete<U extends T = T>(id: string): Promise<U>;
21
- abstract tryLoadAndDelete<U extends T = T>(id: string): Promise<U | undefined>;
22
- abstract loadByFilterAndDelete<U extends T = T>(query: Query<U>, options?: QueryOptions<U>): Promise<U>;
23
- abstract tryLoadByFilterAndDelete<U extends T = T>(query: Query<U>, options?: QueryOptions<U>): Promise<U | undefined>;
24
- abstract loadAndPatch<U extends T = T>(id: string, patch: EntityPatch<U>, includePatch: boolean): Promise<U>;
25
- abstract tryLoadAndPatch<U extends T = T>(id: string, patch: EntityPatch<U>, includePatch: boolean): Promise<U | undefined>;
26
- abstract loadByFilterAndPatch<U extends T = T>(query: Query<U>, patch: EntityPatch<U>, includePatch: boolean, options?: QueryOptions<U>): Promise<U>;
27
- abstract tryLoadByFilterAndPatch<U extends T = T>(query: Query<U>, patch: EntityPatch<U>, includePatch: boolean, options?: QueryOptions<U>): Promise<U | undefined>;
28
- abstract count(allowEstimation?: boolean): Promise<number>;
29
- abstract countByFilter<U extends T>(query: Query<U>, allowEstimation?: boolean): Promise<number>;
30
- abstract has(id: string): Promise<boolean>;
31
- abstract hasByFilter<U extends T>(query: Query<U>): Promise<boolean>;
32
- abstract hasMany(ids: string[]): Promise<string[]>;
33
- abstract hasAll(ids: string[]): Promise<boolean>;
34
- abstract insert<U extends T>(entity: MaybeNewEntity<U>): Promise<U>;
35
- abstract insertMany<U extends T>(entities: MaybeNewEntity<U>[]): Promise<U[]>;
36
- abstract insertIfNotExists<U extends T>(entity: MaybeNewEntity<U>): Promise<U | undefined>;
37
- abstract insertIfNotExistsByFilter<U extends T>(query: Query<U>, entity: MaybeNewEntity<U>): Promise<U | undefined>;
38
- abstract update<U extends T>(entity: U, options?: UpdateOptions): Promise<boolean>;
39
- abstract updateMany<U extends T>(entities: U[], options?: UpdateOptions): Promise<number>;
40
- abstract patch<U extends T = T>(entity: U, patch: EntityPatch<U>): Promise<boolean>;
41
- abstract patchMany<U extends T = T>(entities: U[], patch: EntityPatch<U>): Promise<number>;
42
- abstract patchByFilter<U extends T = T>(query: Query<U>, patch: EntityPatch<U>): Promise<boolean>;
43
- abstract patchManyByFilter<U extends T = T>(query: Query<U>, patch: EntityPatch<U>): Promise<number>;
44
- abstract delete<U extends T>(entity: U): Promise<boolean>;
45
- abstract deleteMany<U extends T>(entities: U[]): Promise<number>;
46
- abstract deleteById(id: string): Promise<boolean>;
47
- abstract deleteManyById(ids: string[]): Promise<number>;
48
- abstract deleteByFilter<U extends T = T>(query: Query<U>): Promise<boolean>;
49
- abstract deleteManyByFilter<U extends T = T>(query: Query<U>): Promise<number>;
50
- }
@@ -1,3 +0,0 @@
1
- export const repositoryType = Symbol('repositoryType');
2
- export class EntityRepository {
3
- }
@@ -1,7 +0,0 @@
1
- export type Entity<Id = string> = {
2
- id: Id;
3
- };
4
- export type NewEntity<T extends Entity | MaybeNewEntity = Entity> = Omit<T, 'id'>;
5
- export type MaybeNewEntity<T extends Entity = Entity> = NewEntity<T> & {
6
- id?: T['id'];
7
- };
@@ -1 +0,0 @@
1
- export {};
package/database/id.d.ts DELETED
@@ -1 +0,0 @@
1
- export declare function getNewId(): string;
package/database/id.js DELETED
@@ -1,9 +0,0 @@
1
- import { Alphabet } from '../utils/alphabet.js';
2
- import { getRandomString } from '../utils/random.js';
3
- import { isDefined } from '../utils/type-guards.js';
4
- import { databaseModuleConfig } from './module.js';
5
- export function getNewId() {
6
- return isDefined(databaseModuleConfig.idGenerator)
7
- ? databaseModuleConfig.idGenerator()
8
- : getRandomString(databaseModuleConfig.idLength ?? 15, databaseModuleConfig.idAlphabet ?? Alphabet.LowerUpperCaseNumbers);
9
- }
@@ -1,11 +0,0 @@
1
- /**
2
- * Repository abstractions
3
- *
4
- * @module Database
5
- */
6
- export * from './entity-repository.js';
7
- export * from './entity.js';
8
- export * from './id.js';
9
- export * from './module.js';
10
- export * from './query.js';
11
- export * from './utils.js';
package/database/index.js DELETED
@@ -1,11 +0,0 @@
1
- /**
2
- * Repository abstractions
3
- *
4
- * @module Database
5
- */
6
- export * from './entity-repository.js';
7
- export * from './entity.js';
8
- export * from './id.js';
9
- export * from './module.js';
10
- export * from './query.js';
11
- export * from './utils.js';
@@ -1,8 +0,0 @@
1
- import { Alphabet } from '../utils/alphabet.js';
2
- export type DatabaseModuleConfig = {
3
- idLength?: number;
4
- idAlphabet?: Alphabet;
5
- idGenerator?: () => string;
6
- };
7
- export declare const databaseModuleConfig: DatabaseModuleConfig;
8
- export declare function configureDatabase(config: DatabaseModuleConfig): void;
@@ -1,11 +0,0 @@
1
- import { Alphabet } from '../utils/alphabet.js';
2
- export const databaseModuleConfig = {
3
- idLength: 15,
4
- idAlphabet: Alphabet.LowerUpperCaseNumbers,
5
- idGenerator: undefined
6
- };
7
- export function configureDatabase(config) {
8
- databaseModuleConfig.idLength = config.idLength;
9
- databaseModuleConfig.idAlphabet = config.idAlphabet;
10
- databaseModuleConfig.idGenerator = config.idGenerator;
11
- }