@tstdl/base 0.92.166 → 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 (308) hide show
  1. package/api/server/middlewares/content-type.middleware.js +1 -1
  2. package/application/application.d.ts +12 -18
  3. package/application/application.js +48 -69
  4. package/application/index.d.ts +1 -5
  5. package/application/index.js +1 -5
  6. package/application/providers.d.ts +10 -0
  7. package/application/providers.js +54 -0
  8. package/authentication/client/authentication.service.d.ts +1 -3
  9. package/authentication/client/authentication.service.js +4 -5
  10. package/browser/browser-context-controller.d.ts +2 -4
  11. package/browser/browser-context-controller.js +5 -6
  12. package/browser/browser-controller.d.ts +2 -4
  13. package/browser/browser-controller.js +3 -4
  14. package/browser/browser.service.d.ts +1 -3
  15. package/browser/browser.service.js +1 -2
  16. package/browser/page-controller.d.ts +2 -4
  17. package/browser/page-controller.js +7 -8
  18. package/browser/utils.js +3 -3
  19. package/cancellation/token.d.ts +104 -41
  20. package/cancellation/token.js +125 -54
  21. package/core.d.ts +1 -13
  22. package/core.js +1 -46
  23. package/disposable/disposable.d.ts +0 -8
  24. package/disposable/disposable.js +1 -3
  25. package/disposable/index.d.ts +0 -6
  26. package/disposable/index.js +0 -6
  27. package/disposable/using.d.ts +0 -1
  28. package/disposable/using.js +2 -3
  29. package/distributed-loop/distributed-loop.js +2 -2
  30. package/errors/utils.js +4 -1
  31. package/examples/api/authentication.js +11 -5
  32. package/examples/api/basic-overview.js +17 -12
  33. package/examples/api/custom-authentication.js +13 -7
  34. package/examples/api/streaming.js +15 -12
  35. package/examples/browser/basic.js +6 -3
  36. package/examples/document-management/main.js +6 -3
  37. package/examples/http/client.js +7 -3
  38. package/examples/mail/basic.js +9 -7
  39. package/examples/pdf/basic.js +8 -6
  40. package/examples/template/basic.js +7 -5
  41. package/http/client/http-client-request.d.ts +1 -2
  42. package/http/client/http-client-request.js +1 -2
  43. package/http/server/http-server.d.ts +1 -3
  44. package/http/server/http-server.js +0 -1
  45. package/http/server/node/node-http-server.d.ts +1 -2
  46. package/http/server/node/node-http-server.js +1 -2
  47. package/import.js +1 -1
  48. package/injector/injector.d.ts +1 -1
  49. package/injector/types.d.ts +3 -4
  50. package/lock/lock.d.ts +40 -21
  51. package/lock/lock.js +74 -1
  52. package/lock/postgres/drizzle/0000_busy_tattoo.sql +7 -0
  53. package/lock/postgres/drizzle/meta/0000_snapshot.json +65 -0
  54. package/lock/postgres/drizzle/meta/_journal.json +13 -0
  55. package/lock/postgres/drizzle.config.js +11 -0
  56. package/lock/postgres/index.d.ts +2 -0
  57. package/lock/postgres/index.js +2 -0
  58. package/lock/postgres/lock.d.ts +14 -0
  59. package/lock/postgres/lock.js +127 -0
  60. package/lock/postgres/models/index.d.ts +2 -0
  61. package/lock/postgres/models/index.js +2 -0
  62. package/lock/postgres/models/lock.model.d.ts +7 -0
  63. package/{examples/orm/user.model.js → lock/postgres/models/lock.model.js} +22 -30
  64. package/lock/postgres/models/schemas.d.ts +3 -0
  65. package/lock/postgres/models/schemas.js +4 -0
  66. package/lock/postgres/module.d.ts +6 -0
  67. package/lock/postgres/module.js +26 -0
  68. package/lock/postgres/provider.d.ts +6 -0
  69. package/lock/postgres/provider.js +29 -0
  70. package/lock/provider.d.ts +12 -2
  71. package/lock/provider.js +24 -1
  72. package/lock/web/web-lock.d.ts +4 -3
  73. package/lock/web/web-lock.js +49 -42
  74. package/lock/web/web-lock.provider.d.ts +0 -3
  75. package/lock/web/web-lock.provider.js +5 -22
  76. package/logger/formatter.d.ts +13 -0
  77. package/logger/formatter.js +3 -0
  78. package/logger/formatters/index.d.ts +2 -0
  79. package/logger/formatters/index.js +2 -0
  80. package/logger/formatters/json.d.ts +5 -0
  81. package/logger/formatters/json.js +33 -0
  82. package/logger/formatters/pretty-print.d.ts +5 -0
  83. package/logger/formatters/pretty-print.js +55 -0
  84. package/logger/index.d.ts +5 -2
  85. package/logger/index.js +5 -2
  86. package/logger/level.d.ts +10 -8
  87. package/logger/level.js +9 -9
  88. package/logger/logger.d.ts +21 -30
  89. package/logger/logger.js +98 -26
  90. package/logger/manager.d.ts +20 -0
  91. package/logger/manager.js +77 -0
  92. package/logger/tokens.d.ts +1 -1
  93. package/logger/tokens.js +1 -1
  94. package/logger/transport.d.ts +14 -0
  95. package/logger/transport.js +16 -0
  96. package/logger/transports/console.d.ts +14 -0
  97. package/logger/transports/console.js +36 -0
  98. package/logger/transports/index.d.ts +1 -0
  99. package/logger/transports/index.js +1 -0
  100. package/mail/clients/nodemailer.mail-client.d.ts +0 -1
  101. package/mail/clients/nodemailer.mail-client.js +9 -7
  102. package/message-bus/local/local-message-bus.js +2 -2
  103. package/message-bus/message-bus-base.d.ts +2 -3
  104. package/message-bus/message-bus-base.js +5 -6
  105. package/message-bus/message-bus.d.ts +1 -2
  106. package/message-bus/message-bus.js +1 -2
  107. package/module/index.d.ts +0 -2
  108. package/module/index.js +0 -2
  109. package/module/module.d.ts +17 -18
  110. package/module/module.js +47 -12
  111. package/module/modules/function.module.d.ts +6 -6
  112. package/module/modules/function.module.js +25 -9
  113. package/module/modules/web-server.module.d.ts +2 -10
  114. package/module/modules/web-server.module.js +3 -11
  115. package/openid-connect/index.d.ts +0 -2
  116. package/openid-connect/index.js +0 -2
  117. package/openid-connect/oidc-state.model.d.ts +4 -5
  118. package/openid-connect/oidc-state.model.js +51 -1
  119. package/openid-connect/oidc.service-model.d.ts +1 -1
  120. package/openid-connect/oidc.service.d.ts +2 -6
  121. package/openid-connect/oidc.service.js +24 -37
  122. package/orm/decorators.d.ts +10 -1
  123. package/orm/decorators.js +8 -0
  124. package/orm/server/repository.d.ts +3 -1
  125. package/orm/server/repository.js +32 -3
  126. package/package.json +17 -28
  127. package/pdf/pdf.service.js +9 -9
  128. package/pool/pool.d.ts +1 -3
  129. package/pool/pool.js +3 -4
  130. package/queue/postgres/job.model.d.ts +1 -2
  131. package/queue/postgres/job.model.js +1 -2
  132. package/queue/postgres/module.js +1 -1
  133. package/threading/thread-pool.d.ts +1 -3
  134. package/threading/thread-pool.js +7 -8
  135. package/utils/format-error.d.ts +7 -0
  136. package/utils/format-error.js +59 -17
  137. package/utils/index.d.ts +1 -0
  138. package/utils/index.js +1 -0
  139. package/utils/object/dereference.d.ts +51 -19
  140. package/utils/object/dereference.js +52 -43
  141. package/utils/timing.js +2 -2
  142. package/utils/try-chain.d.ts +22 -0
  143. package/utils/try-chain.js +46 -0
  144. package/database/entity-repository.d.ts +0 -50
  145. package/database/entity-repository.js +0 -3
  146. package/database/entity.d.ts +0 -7
  147. package/database/entity.js +0 -1
  148. package/database/id.d.ts +0 -1
  149. package/database/id.js +0 -9
  150. package/database/index.d.ts +0 -11
  151. package/database/index.js +0 -11
  152. package/database/module.d.ts +0 -8
  153. package/database/module.js +0 -11
  154. package/database/mongo/classes.d.ts +0 -21
  155. package/database/mongo/classes.js +0 -26
  156. package/database/mongo/index.d.ts +0 -15
  157. package/database/mongo/index.js +0 -15
  158. package/database/mongo/model/document.d.ts +0 -29
  159. package/database/mongo/model/document.js +0 -63
  160. package/database/mongo/model/index.d.ts +0 -1
  161. package/database/mongo/model/index.js +0 -1
  162. package/database/mongo/module.d.ts +0 -8
  163. package/database/mongo/module.js +0 -68
  164. package/database/mongo/mongo-base.repository.d.ts +0 -103
  165. package/database/mongo/mongo-base.repository.js +0 -263
  166. package/database/mongo/mongo-bulk.d.ts +0 -35
  167. package/database/mongo/mongo-bulk.js +0 -90
  168. package/database/mongo/mongo-entity-repository.d.ts +0 -98
  169. package/database/mongo/mongo-entity-repository.js +0 -278
  170. package/database/mongo/operations.d.ts +0 -10
  171. package/database/mongo/operations.js +0 -54
  172. package/database/mongo/query-converter.d.ts +0 -6
  173. package/database/mongo/query-converter.js +0 -83
  174. package/database/mongo/simple-entity-repository.d.ts +0 -7
  175. package/database/mongo/simple-entity-repository.js +0 -6
  176. package/database/mongo/types.d.ts +0 -50
  177. package/database/mongo/types.js +0 -3
  178. package/database/query.d.ts +0 -121
  179. package/database/query.js +0 -7
  180. package/database/utils.d.ts +0 -2
  181. package/database/utils.js +0 -3
  182. package/disposable/async-disposer.d.ts +0 -35
  183. package/disposable/async-disposer.js +0 -125
  184. package/examples/orm/drizzle.config.js +0 -6
  185. package/examples/orm/schemas.d.ts +0 -3
  186. package/examples/orm/schemas.js +0 -4
  187. package/examples/orm/test.d.ts +0 -1
  188. package/examples/orm/test.js +0 -11
  189. package/examples/orm/user.model.d.ts +0 -13
  190. package/key-value-store/mongo/index.d.ts +0 -6
  191. package/key-value-store/mongo/index.js +0 -6
  192. package/key-value-store/mongo/module.d.ts +0 -8
  193. package/key-value-store/mongo/module.js +0 -18
  194. package/key-value-store/mongo/mongo-key-value-store.provider.d.ts +0 -8
  195. package/key-value-store/mongo/mongo-key-value-store.provider.js +0 -26
  196. package/key-value-store/mongo/mongo-key-value.model.d.ts +0 -7
  197. package/key-value-store/mongo/mongo-key-value.model.js +0 -1
  198. package/key-value-store/mongo/mongo-key-value.repository.d.ts +0 -10
  199. package/key-value-store/mongo/mongo-key-value.repository.js +0 -31
  200. package/key-value-store/mongo/mongo-key-value.store.d.ts +0 -15
  201. package/key-value-store/mongo/mongo-key-value.store.js +0 -82
  202. package/key-value-store/mongo/tokens.d.ts +0 -3
  203. package/key-value-store/mongo/tokens.js +0 -2
  204. package/lock/mongo/index.d.ts +0 -5
  205. package/lock/mongo/index.js +0 -5
  206. package/lock/mongo/lock.d.ts +0 -14
  207. package/lock/mongo/lock.js +0 -125
  208. package/lock/mongo/model.d.ts +0 -6
  209. package/lock/mongo/model.js +0 -1
  210. package/lock/mongo/module.d.ts +0 -12
  211. package/lock/mongo/module.js +0 -20
  212. package/lock/mongo/mongo-lock-repository.d.ts +0 -14
  213. package/lock/mongo/mongo-lock-repository.js +0 -67
  214. package/lock/mongo/provider.d.ts +0 -8
  215. package/lock/mongo/provider.js +0 -36
  216. package/logger/console/index.d.ts +0 -1
  217. package/logger/console/index.js +0 -1
  218. package/logger/console/logger.d.ts +0 -11
  219. package/logger/console/logger.js +0 -64
  220. package/logger/noop/index.d.ts +0 -1
  221. package/logger/noop/index.js +0 -1
  222. package/logger/noop/logger.d.ts +0 -9
  223. package/logger/noop/logger.js +0 -21
  224. package/migration/index.d.ts +0 -9
  225. package/migration/index.js +0 -9
  226. package/migration/migration-state-repository.d.ts +0 -4
  227. package/migration/migration-state-repository.js +0 -3
  228. package/migration/migration-state.d.ts +0 -6
  229. package/migration/migration-state.js +0 -1
  230. package/migration/migrator.d.ts +0 -23
  231. package/migration/migrator.js +0 -76
  232. package/migration/mongo/index.d.ts +0 -2
  233. package/migration/mongo/index.js +0 -2
  234. package/migration/mongo/migration-state-repository.d.ts +0 -11
  235. package/migration/mongo/migration-state-repository.js +0 -32
  236. package/migration/mongo/module.d.ts +0 -12
  237. package/migration/mongo/module.js +0 -17
  238. package/module/module-base.d.ts +0 -18
  239. package/module/module-base.js +0 -40
  240. package/module/module-metric-reporter.d.ts +0 -29
  241. package/module/module-metric-reporter.js +0 -62
  242. package/openid-connect/mongo-oidc-state.repository.d.ts +0 -21
  243. package/openid-connect/mongo-oidc-state.repository.js +0 -52
  244. package/openid-connect/oidc-state.repository.d.ts +0 -4
  245. package/openid-connect/oidc-state.repository.js +0 -3
  246. package/process-shutdown.d.ts +0 -9
  247. package/process-shutdown.js +0 -65
  248. package/queue/mongo/index.d.ts +0 -4
  249. package/queue/mongo/index.js +0 -4
  250. package/queue/mongo/job.d.ts +0 -12
  251. package/queue/mongo/job.js +0 -1
  252. package/queue/mongo/mongo-job.repository.d.ts +0 -13
  253. package/queue/mongo/mongo-job.repository.js +0 -54
  254. package/queue/mongo/queue.d.ts +0 -38
  255. package/queue/mongo/queue.js +0 -266
  256. package/queue/mongo/queue.provider.d.ts +0 -18
  257. package/queue/mongo/queue.provider.js +0 -38
  258. package/search-index/elastic/config.d.ts +0 -8
  259. package/search-index/elastic/config.js +0 -26
  260. package/search-index/elastic/index.d.ts +0 -8
  261. package/search-index/elastic/index.js +0 -8
  262. package/search-index/elastic/keyword-rewriter.d.ts +0 -8
  263. package/search-index/elastic/keyword-rewriter.js +0 -18
  264. package/search-index/elastic/model/elastic-query.d.ts +0 -16
  265. package/search-index/elastic/model/elastic-query.js +0 -1
  266. package/search-index/elastic/model/index-mapping.d.ts +0 -26
  267. package/search-index/elastic/model/index-mapping.js +0 -4
  268. package/search-index/elastic/model/index.d.ts +0 -3
  269. package/search-index/elastic/model/index.js +0 -3
  270. package/search-index/elastic/model/sort.d.ts +0 -8
  271. package/search-index/elastic/model/sort.js +0 -1
  272. package/search-index/elastic/module.d.ts +0 -10
  273. package/search-index/elastic/module.js +0 -49
  274. package/search-index/elastic/query-builder/boolean-query-builder.d.ts +0 -11
  275. package/search-index/elastic/query-builder/boolean-query-builder.js +0 -52
  276. package/search-index/elastic/query-builder/index.d.ts +0 -1
  277. package/search-index/elastic/query-builder/index.js +0 -1
  278. package/search-index/elastic/query-converter.d.ts +0 -9
  279. package/search-index/elastic/query-converter.js +0 -183
  280. package/search-index/elastic/search-index.d.ts +0 -30
  281. package/search-index/elastic/search-index.js +0 -144
  282. package/search-index/elastic/sort-converter.d.ts +0 -4
  283. package/search-index/elastic/sort-converter.js +0 -14
  284. package/search-index/elastic/types.d.ts +0 -5
  285. package/search-index/elastic/types.js +0 -1
  286. package/search-index/error.d.ts +0 -10
  287. package/search-index/error.js +0 -14
  288. package/search-index/index.d.ts +0 -3
  289. package/search-index/index.js +0 -3
  290. package/search-index/memory/index.d.ts +0 -1
  291. package/search-index/memory/index.js +0 -1
  292. package/search-index/memory/memory-search-index.d.ts +0 -19
  293. package/search-index/memory/memory-search-index.js +0 -144
  294. package/search-index/search-index.d.ts +0 -46
  295. package/search-index/search-index.js +0 -31
  296. package/search-index/search-result.d.ts +0 -12
  297. package/search-index/search-result.js +0 -1
  298. package/theme/adapters/css-adapter.d.ts +0 -5
  299. package/theme/adapters/css-adapter.js +0 -29
  300. package/theme/adapters/index.d.ts +0 -2
  301. package/theme/adapters/index.js +0 -2
  302. package/theme/adapters/tailwind-adapter.d.ts +0 -18
  303. package/theme/adapters/tailwind-adapter.js +0 -32
  304. package/theme/index.d.ts +0 -1
  305. package/theme/index.js +0 -1
  306. package/theme/theme-service.d.ts +0 -43
  307. package/theme/theme-service.js +0 -128
  308. /package/{examples/orm → lock/postgres}/drizzle.config.d.ts +0 -0
@@ -4,61 +4,68 @@ 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 { map, timer } from 'rxjs';
8
- import { CancellationToken } from '../../cancellation/index.js';
9
7
  import { Injectable } from '../../injector/index.js';
10
8
  import { DeferredPromise } from '../../promise/deferred-promise.js';
11
- import { assertStringPass, isDefined, isNull, isObject } from '../../utils/type-guards.js';
9
+ import { assertStringPass, isNull, isObject, isUndefined } from '../../utils/type-guards.js';
12
10
  import { Lock } from '../lock.js';
13
11
  import { WebLockProvider } from './web-lock.provider.js';
14
12
  let WebLock = class WebLock extends Lock {
15
- async acquire(timeout, throwOnFail) {
16
- const acquirePromise = new DeferredPromise();
13
+ async tryAcquireOnce() {
14
+ return await this.tryAcquire(0);
15
+ }
16
+ async tryAcquire(timeout) {
17
+ const controllerPromise = new DeferredPromise();
17
18
  const releasePromise = new DeferredPromise();
18
- const controller = {
19
- lost: false,
20
- release() {
21
- releasePromise.resolve();
22
- },
23
- };
24
- const timeoutToken = (isDefined(timeout) && (timeout > 0)) ? CancellationToken.from(timer(timeout).pipe(map(() => true))) : undefined;
25
- void navigator.locks.request(this.resource, {
26
- signal: isDefined(timeoutToken) ? timeoutToken.asAbortSignal() : undefined,
27
- ifAvailable: isDefined(timeout) && (timeout <= 0),
28
- }, async (lock) => {
19
+ const ifAvailable = isUndefined(timeout) || (timeout <= 0);
20
+ const signal = ifAvailable ? undefined : AbortSignal.any([AbortSignal.timeout(timeout), this.cancellationSignal.asAbortSignal()]);
21
+ await navigator.locks
22
+ .request(this.resource, { signal, ifAvailable }, async (lock) => {
29
23
  if (isNull(lock)) {
30
- acquirePromise.resolve(false);
31
- return;
24
+ throw new Error('Failed to acquire lock.');
32
25
  }
33
- acquirePromise.resolve(true);
26
+ let lost = false;
27
+ controllerPromise.resolve({
28
+ get lost() {
29
+ return lost;
30
+ },
31
+ async release() {
32
+ releasePromise.resolve();
33
+ },
34
+ });
34
35
  await releasePromise;
36
+ lost = true;
35
37
  })
36
- .catch((error) => acquirePromise.reject(error));
37
- try {
38
- const success = await acquirePromise;
39
- if (!success) {
40
- throw new Error('Failed to acquire lock.');
41
- }
42
- return controller;
43
- }
44
- catch (error) {
45
- if (throwOnFail) {
46
- throw error;
47
- }
48
- return false;
49
- }
38
+ .catch(() => controllerPromise.resolve(false));
39
+ return await controllerPromise;
50
40
  }
51
- async use(timeout, throwOnFail, func) {
52
- const controller = await this.acquire(timeout, throwOnFail);
53
- if (controller == false) {
54
- return { success: false, result: undefined };
55
- }
41
+ async tryUse(timeout, func) {
42
+ const ifAvailable = isUndefined(timeout) || (timeout <= 0);
43
+ const signal = ifAvailable ? undefined : AbortSignal.any([AbortSignal.timeout(timeout), this.cancellationSignal.asAbortSignal()]);
44
+ let result;
56
45
  try {
57
- const result = await func(controller);
58
- return { success: true, result };
46
+ result = await navigator.locks.request(this.resource, { signal, ifAvailable }, async (lock) => {
47
+ if (isNull(lock)) {
48
+ return { type: 'already-locked' };
49
+ }
50
+ try {
51
+ const returnValue = await func({ lost: false });
52
+ return { type: 'result', value: returnValue };
53
+ }
54
+ catch (error) {
55
+ return { type: 'error', error };
56
+ }
57
+ });
58
+ }
59
+ catch {
60
+ return { success: false }; // navigator.locks.request throws a DOMException on timeout
59
61
  }
60
- finally {
61
- await controller.release();
62
+ switch (result.type) {
63
+ case 'result':
64
+ return { success: true, result: result.value };
65
+ case 'already-locked':
66
+ return { success: false };
67
+ case 'error':
68
+ throw result.error;
62
69
  }
63
70
  }
64
71
  async exists() {
@@ -1,8 +1,5 @@
1
1
  import type { Lock } from '../../lock/index.js';
2
2
  import { LockProvider } from '../../lock/index.js';
3
3
  export declare class WebLockProvider extends LockProvider {
4
- private readonly _prefix;
5
- constructor(prefix?: string);
6
- prefix(prefix: string): LockProvider;
7
4
  get(resource: string): Lock;
8
5
  }
@@ -4,32 +4,15 @@ 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
- var WebLockProvider_1;
14
- import { InjectArg, Singleton } from '../../injector/index.js';
7
+ import { Singleton } from '../../injector/index.js';
15
8
  import { LockProvider } from '../../lock/index.js';
16
9
  import { WebLock } from './web-lock.js';
17
- let WebLockProvider = WebLockProvider_1 = class WebLockProvider extends LockProvider {
18
- _prefix;
19
- constructor(prefix = '') {
20
- super();
21
- this._prefix = prefix;
22
- }
23
- prefix(prefix) {
24
- return new WebLockProvider_1(this._prefix + prefix);
25
- }
10
+ let WebLockProvider = class WebLockProvider extends LockProvider {
26
11
  get(resource) {
27
- return new WebLock(this._prefix + resource);
12
+ return new WebLock(this.getResourceString(resource, this._prefix), this.cancellationSignal);
28
13
  }
29
14
  };
30
- WebLockProvider = WebLockProvider_1 = __decorate([
31
- Singleton(),
32
- __param(0, InjectArg()),
33
- __metadata("design:paramtypes", [String])
15
+ WebLockProvider = __decorate([
16
+ Singleton()
34
17
  ], WebLockProvider);
35
18
  export { WebLockProvider };
@@ -0,0 +1,13 @@
1
+ import type { Record } from '../types/types.js';
2
+ import type { LogLevel } from './level.js';
3
+ export type LogPayload = {
4
+ timestamp: Date;
5
+ level: LogLevel;
6
+ module: string[];
7
+ message: string;
8
+ context: Record<string>;
9
+ };
10
+ /** Formats a log payload for a transport. */
11
+ export declare abstract class LogFormatter {
12
+ abstract format(payload: LogPayload): string;
13
+ }
@@ -0,0 +1,3 @@
1
+ /** Formats a log payload for a transport. */
2
+ export class LogFormatter {
3
+ }
@@ -0,0 +1,2 @@
1
+ export * from './json.js';
2
+ export * from './pretty-print.js';
@@ -0,0 +1,2 @@
1
+ export * from './json.js';
2
+ export * from './pretty-print.js';
@@ -0,0 +1,5 @@
1
+ import { LogFormatter, type LogPayload } from '../formatter.js';
2
+ /** Formats log entries as a JSON string. */
3
+ export declare class JsonLogFormatter extends LogFormatter {
4
+ format(payload: LogPayload): string;
5
+ }
@@ -0,0 +1,33 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Singleton } from '../../injector/decorators.js';
8
+ import { enumValueName } from '../../utils/enum.js';
9
+ import { formatError } from '../../utils/format-error.js';
10
+ import { isNotNullOrUndefined } from '../../utils/type-guards.js';
11
+ import { LogFormatter } from '../formatter.js';
12
+ import { LogLevel } from '../level.js';
13
+ /** Formats log entries as a JSON string. */
14
+ let JsonLogFormatter = class JsonLogFormatter extends LogFormatter {
15
+ format(payload) {
16
+ const logObject = {
17
+ timestamp: payload.timestamp.toISOString(),
18
+ level: enumValueName(LogLevel, payload.level).toLowerCase(),
19
+ module: (payload.module.length > 0) ? payload.module.join('.') : null,
20
+ message: payload.message,
21
+ ...payload.context,
22
+ };
23
+ // Special handling for error objects to make them serializable
24
+ if (isNotNullOrUndefined(logObject['error'])) {
25
+ logObject['error'] = formatError(logObject['error'], { includeStack: true });
26
+ }
27
+ return JSON.stringify(logObject);
28
+ }
29
+ };
30
+ JsonLogFormatter = __decorate([
31
+ Singleton()
32
+ ], JsonLogFormatter);
33
+ export { JsonLogFormatter };
@@ -0,0 +1,5 @@
1
+ import { LogFormatter, type LogPayload } from '../formatter.js';
2
+ /** Formats log entries in a human-readable, colorful format for development consoles. */
3
+ export declare class PrettyPrintLogFormatter extends LogFormatter {
4
+ format(payload: LogPayload): string;
5
+ }
@@ -0,0 +1,55 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Singleton } from '../../injector/decorators.js';
8
+ import { enumValueName } from '../../utils/enum.js';
9
+ import { formatError } from '../../utils/format-error.js';
10
+ import { isNotNullOrUndefined } from '../../utils/type-guards.js';
11
+ import { LogFormatter } from '../formatter.js';
12
+ import { LogLevel } from '../level.js';
13
+ const levelColorMap = {
14
+ [LogLevel.Error]: '\x1b[31m', // Red
15
+ [LogLevel.Warn]: '\x1b[33m', // Yellow
16
+ [LogLevel.Info]: '\x1b[32m', // Green
17
+ [LogLevel.Verbose]: '\x1b[36m', // Cyan
18
+ [LogLevel.Debug]: '\x1b[34m', // Blue
19
+ [LogLevel.Trace]: '\x1b[90m', // Gray
20
+ };
21
+ const resetColor = '\x1b[0m';
22
+ const dimColor = '\x1b[2m';
23
+ /** Formats log entries in a human-readable, colorful format for development consoles. */
24
+ let PrettyPrintLogFormatter = class PrettyPrintLogFormatter extends LogFormatter {
25
+ format(payload) {
26
+ const color = levelColorMap[payload.level];
27
+ const levelName = enumValueName(LogLevel, payload.level).toUpperCase();
28
+ const levelString = `${levelName}:`.padEnd(8);
29
+ const moduleString = payload.module.map((m) => `[${m}]`).join(' ');
30
+ const metadata = { ...payload.context };
31
+ let metadataString = '';
32
+ let errorString = '';
33
+ if (Object.keys(metadata).length > 0) {
34
+ const displayMeta = {};
35
+ // Don't display metadata used in interpolation
36
+ const interpolationKeys = Array.from(payload.message.matchAll(/{([^{}]+)}/g)).map((match) => match[1]);
37
+ for (const key in metadata) {
38
+ if (!interpolationKeys.includes(key)) {
39
+ displayMeta[key] = metadata[key];
40
+ }
41
+ }
42
+ if (Object.keys(displayMeta).length > 0) {
43
+ metadataString = ` ${dimColor}${JSON.stringify(displayMeta)}${resetColor}`;
44
+ }
45
+ if (isNotNullOrUndefined(metadata['error'])) {
46
+ errorString += `\n${formatError(metadata['error'], { includeStack: true })}`;
47
+ }
48
+ }
49
+ return `${dimColor}${payload.timestamp.toISOString()}${resetColor} ${color}${levelString}${resetColor} ${moduleString}${moduleString.length > 0 ? ' ' : ''}${payload.message}${metadataString}${errorString}`;
50
+ }
51
+ };
52
+ PrettyPrintLogFormatter = __decorate([
53
+ Singleton()
54
+ ], PrettyPrintLogFormatter);
55
+ export { PrettyPrintLogFormatter };
package/logger/index.d.ts CHANGED
@@ -3,8 +3,11 @@
3
3
  *
4
4
  * @module Logger
5
5
  */
6
- export * from './console/index.js';
6
+ export * from './formatter.js';
7
+ export * from './formatters/index.js';
7
8
  export * from './level.js';
8
9
  export * from './logger.js';
9
- export * from './noop/index.js';
10
+ export * from './manager.js';
10
11
  export * from './tokens.js';
12
+ export * from './transport.js';
13
+ export * from './transports/index.js';
package/logger/index.js CHANGED
@@ -3,8 +3,11 @@
3
3
  *
4
4
  * @module Logger
5
5
  */
6
- export * from './console/index.js';
6
+ export * from './formatter.js';
7
+ export * from './formatters/index.js';
7
8
  export * from './level.js';
8
9
  export * from './logger.js';
9
- export * from './noop/index.js';
10
+ export * from './manager.js';
10
11
  export * from './tokens.js';
12
+ export * from './transport.js';
13
+ export * from './transports/index.js';
package/logger/level.d.ts CHANGED
@@ -1,8 +1,10 @@
1
- export declare enum LogLevel {
2
- Error = 0,
3
- Warn = 1,
4
- Info = 2,
5
- Verbose = 3,
6
- Debug = 4,
7
- Trace = 5
8
- }
1
+ import { type EnumType } from '../enumeration/enumeration.js';
2
+ export declare const LogLevel: {
3
+ readonly Error: 0;
4
+ readonly Warn: 1;
5
+ readonly Info: 2;
6
+ readonly Verbose: 3;
7
+ readonly Debug: 4;
8
+ readonly Trace: 5;
9
+ };
10
+ export type LogLevel = EnumType<typeof LogLevel>;
package/logger/level.js CHANGED
@@ -1,9 +1,9 @@
1
- export var LogLevel;
2
- (function (LogLevel) {
3
- LogLevel[LogLevel["Error"] = 0] = "Error";
4
- LogLevel[LogLevel["Warn"] = 1] = "Warn";
5
- LogLevel[LogLevel["Info"] = 2] = "Info";
6
- LogLevel[LogLevel["Verbose"] = 3] = "Verbose";
7
- LogLevel[LogLevel["Debug"] = 4] = "Debug";
8
- LogLevel[LogLevel["Trace"] = 5] = "Trace";
9
- })(LogLevel || (LogLevel = {}));
1
+ import { defineEnum } from '../enumeration/enumeration.js';
2
+ export const LogLevel = defineEnum('LogLevel', {
3
+ Error: 0,
4
+ Warn: 1,
5
+ Info: 2,
6
+ Verbose: 3,
7
+ Debug: 4,
8
+ Trace: 5,
9
+ });
@@ -1,41 +1,32 @@
1
1
  import type { Resolvable } from '../injector/index.js';
2
2
  import { resolveArgumentType } from '../injector/index.js';
3
+ import type { Record } from '../types/types.js';
3
4
  import { LogLevel } from './level.js';
4
- export type LogEntry = string;
5
- export type LogEntryProvider = () => LogEntry;
6
- export type LogEntryOrProvider = LogEntry | LogEntryProvider;
7
- export type LoggerStatic = new (level: LogLevel) => Logger;
8
- export type LogErrorOptions = {
9
- includeRest?: boolean;
10
- includeStack?: boolean;
11
- };
12
- /** Either string as a module shorthand or object */
13
- export type LoggerArgument = string | undefined | {
14
- level?: LogLevel;
5
+ export type LoggerArgument = string | string[] | {
15
6
  module?: string | string[];
16
- prefix?: string;
7
+ context?: Record<string>;
8
+ level?: LogLevel;
17
9
  };
18
10
  export type LoggerForkOptions = {
19
- subModule?: string;
20
- prefix?: string;
11
+ context?: Record<string>;
12
+ replaceContext?: boolean;
21
13
  level?: LogLevel;
22
14
  };
23
- export declare abstract class Logger implements Resolvable<LoggerArgument> {
24
- readonly level: LogLevel;
25
- readonly module?: string[];
26
- readonly logPrefix: string;
15
+ export declare class Logger implements Resolvable<LoggerArgument> {
16
+ #private;
17
+ readonly module: string[];
18
+ readonly context: Record<string>;
19
+ readonly level: LogLevel | undefined;
27
20
  readonly [resolveArgumentType]: LoggerArgument;
28
- constructor(level: LogLevel, module?: string | string[], prefix?: string);
29
- error(entry: LogEntryOrProvider): void;
30
- error(error: unknown, options?: LogErrorOptions): void;
31
- warn(entry: LogEntryOrProvider): void;
32
- info(entry: LogEntryOrProvider): void;
33
- verbose(entry: LogEntryOrProvider): void;
34
- debug(entry: LogEntryOrProvider): void;
35
- trace(entry: LogEntryOrProvider): void;
21
+ error(message: string, context?: Record<string>): void;
22
+ error(error: unknown, context?: Record<string>): void;
23
+ warn(message: string, context?: Record<string>): void;
24
+ info(message: string, context?: Record<string>): void;
25
+ verbose(message: string, context?: Record<string>): void;
26
+ debug(message: string, context?: Record<string>): void;
27
+ trace(message: string, context?: Record<string>): void;
28
+ fork(subModule: string | string[], options?: LoggerForkOptions): Logger;
29
+ fork(options: LoggerForkOptions): Logger;
30
+ with(context: Record<string>): Logger;
36
31
  private _log;
37
- abstract fork(options: LoggerForkOptions): Logger;
38
- abstract subModule(subModule: string): Logger;
39
- abstract prefix(prefix: string): Logger;
40
- protected abstract log(level: LogLevel, entry: LogEntry | Error, errorOptions?: LogErrorOptions): void;
41
32
  }
package/logger/logger.js CHANGED
@@ -1,39 +1,111 @@
1
- import { resolveArgumentType } from '../injector/index.js';
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var Logger_1;
8
+ import { createContextProvider } from '../context/context.js';
9
+ import { inject, Injectable, injectArgument, isInInjectionContext, resolveArgumentType } from '../injector/index.js';
2
10
  import { toArray } from '../utils/array/array.js';
3
- import { isDefined, isFunction } from '../utils/type-guards.js';
11
+ import { now } from '../utils/date-time.js';
12
+ import { getCachedDereference } from '../utils/object/dereference.js';
13
+ import { hasOwnProperty } from '../utils/object/object.js';
14
+ import { isArray, isNotArray, isObject, isString } from '../utils/type-guards.js';
4
15
  import { LogLevel } from './level.js';
5
- export class Logger {
6
- level;
7
- module;
8
- logPrefix;
9
- constructor(level, module, prefix = '') {
10
- this.level = level;
11
- this.module = isDefined(module) ? toArray(module) : undefined;
12
- this.logPrefix = prefix;
16
+ import { LogManager } from './manager.js';
17
+ const { getCurrentLoggerCreationContext, runInLoggerCreationContext, isInLoggerCreationContext } = createContextProvider('LoggerCreation');
18
+ let Logger = Logger_1 = class Logger {
19
+ #manager = getCurrentLoggerCreationContext()?.manager ?? inject(LogManager);
20
+ #argument = isInInjectionContext() ? injectArgument(this, { optional: true }) : undefined;
21
+ module = getCurrentLoggerCreationContext()?.module ?? moduleFromArgument(this.#argument);
22
+ context = getCurrentLoggerCreationContext()?.context ?? ((isObject(this.#argument) && isNotArray(this.#argument)) ? (this.#argument.context ?? {}) : {});
23
+ level = isInLoggerCreationContext() ? getCurrentLoggerCreationContext().level : (isObject(this.#argument) && isNotArray(this.#argument)) ? this.#argument.level : undefined;
24
+ error(errorOrMessage, context) {
25
+ if (isString(errorOrMessage)) {
26
+ this._log(LogLevel.Error, errorOrMessage, context);
27
+ }
28
+ else {
29
+ const message = (errorOrMessage instanceof Error) ? errorOrMessage.message : 'Error';
30
+ this._log(LogLevel.Error, message, { ...context, error: errorOrMessage });
31
+ }
13
32
  }
14
- error(errorOrEntry, options) {
15
- this._log(LogLevel.Error, errorOrEntry, options);
33
+ warn(message, context) {
34
+ this._log(LogLevel.Warn, message, context);
16
35
  }
17
- warn(entry) {
18
- this._log(LogLevel.Warn, entry);
36
+ info(message, context) {
37
+ this._log(LogLevel.Info, message, context);
19
38
  }
20
- info(entry) {
21
- this._log(LogLevel.Info, entry);
39
+ verbose(message, context) {
40
+ this._log(LogLevel.Verbose, message, context);
22
41
  }
23
- verbose(entry) {
24
- this._log(LogLevel.Verbose, entry);
42
+ debug(message, context) {
43
+ this._log(LogLevel.Debug, message, context);
25
44
  }
26
- debug(entry) {
27
- this._log(LogLevel.Debug, entry);
45
+ trace(message, context) {
46
+ this._log(LogLevel.Trace, message, context);
28
47
  }
29
- trace(entry) {
30
- this._log(LogLevel.Trace, entry);
48
+ fork(subModuleOrOptions, optionsOrNothing) {
49
+ const subModule = (isString(subModuleOrOptions) || isArray(subModuleOrOptions)) ? subModuleOrOptions : [];
50
+ const options = (isString(subModuleOrOptions) || isArray(subModuleOrOptions)) ? optionsOrNothing : subModuleOrOptions;
51
+ const newModule = [...this.module, ...toArray(subModule)];
52
+ const creationContext = {
53
+ manager: this.#manager,
54
+ module: newModule,
55
+ context: (options?.replaceContext == true) ? (options.context ?? {}) : { ...this.context, ...options?.context },
56
+ level: options?.level ?? this.level,
57
+ };
58
+ return runInLoggerCreationContext(creationContext, () => new Logger_1());
31
59
  }
32
- _log(level, entryOrProvider, errorOptions) {
33
- if (this.level < level) {
60
+ with(context) {
61
+ const creationContext = {
62
+ manager: this.#manager,
63
+ module: this.module,
64
+ context: { ...this.context, ...context },
65
+ level: this.level,
66
+ };
67
+ return runInLoggerCreationContext(creationContext, () => new Logger_1());
68
+ }
69
+ _log(level, message, context = {}) {
70
+ const moduleLevel = this.level ?? this.#manager.getModuleLevel(this.module);
71
+ if (level > moduleLevel) {
34
72
  return;
35
73
  }
36
- const entry = isFunction(entryOrProvider) ? entryOrProvider() : entryOrProvider;
37
- this.log(level, entry, errorOptions);
74
+ const effectiveContext = { ...this.context, ...context };
75
+ const finalMessage = interpolateMessage(message, effectiveContext);
76
+ const payload = {
77
+ timestamp: now(),
78
+ level,
79
+ module: this.module,
80
+ message: finalMessage,
81
+ context: effectiveContext,
82
+ };
83
+ this.#manager.log(payload);
84
+ }
85
+ };
86
+ Logger = Logger_1 = __decorate([
87
+ Injectable()
88
+ ], Logger);
89
+ export { Logger };
90
+ function moduleFromArgument(argument) {
91
+ if (isString(argument)) {
92
+ return toArray(argument);
38
93
  }
94
+ if (isArray(argument)) {
95
+ return argument;
96
+ }
97
+ if (isObject(argument)) {
98
+ return moduleFromArgument(argument.module);
99
+ }
100
+ return [];
101
+ }
102
+ const cachedDereference = getCachedDereference({ optional: true });
103
+ function interpolateMessage(message, context) {
104
+ return message.replace(/{([^{}]+)}/g, (match, key) => {
105
+ if (hasOwnProperty(context, key)) {
106
+ const value = cachedDereference(context, key);
107
+ return String(value);
108
+ }
109
+ return match;
110
+ });
39
111
  }
@@ -0,0 +1,20 @@
1
+ import type { LogPayload } from './formatter.js';
2
+ import { LogLevel } from './level.js';
3
+ export declare class LogManager {
4
+ #private;
5
+ log(payload: LogPayload): void;
6
+ setDefaultLevel(level: LogLevel): void;
7
+ /**
8
+ * Sets the log level for a specific module.
9
+ * @param module The module (e.g., 'Api.Users' or ['Api', 'Users'])
10
+ * @param level The log level to set
11
+ */
12
+ setModuleLevel(module: string | string[], level: LogLevel): void;
13
+ /**
14
+ * Gets the effective log level for a given module path.
15
+ * It finds the most specific rule matching the module path.
16
+ * @param modulePath Array of module names, e.g., ['Api', 'Users']
17
+ * @returns The effective log level
18
+ */
19
+ getModuleLevel(modulePath?: string | string[]): LogLevel;
20
+ }