@open-mercato/shared 0.6.6-develop.6460.1.f94c74174c → 0.6.6-develop.6471.1.9ab5bdd79a

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 (164) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/AGENTS.md +1 -0
  3. package/dist/lib/commands/command-bus.js +4 -2
  4. package/dist/lib/commands/command-bus.js.map +2 -2
  5. package/dist/lib/commands/command-interceptor-runner.js +4 -2
  6. package/dist/lib/commands/command-interceptor-runner.js.map +2 -2
  7. package/dist/lib/commands/flush.js +3 -4
  8. package/dist/lib/commands/flush.js.map +2 -2
  9. package/dist/lib/commands/helpers.js +3 -1
  10. package/dist/lib/commands/helpers.js.map +2 -2
  11. package/dist/lib/commands/registry.js +5 -3
  12. package/dist/lib/commands/registry.js.map +2 -2
  13. package/dist/lib/commands/scope.js +5 -3
  14. package/dist/lib/commands/scope.js.map +2 -2
  15. package/dist/lib/crud/advanced-filter-integration.js +3 -1
  16. package/dist/lib/crud/advanced-filter-integration.js.map +2 -2
  17. package/dist/lib/crud/cache.js +3 -1
  18. package/dist/lib/crud/cache.js.map +2 -2
  19. package/dist/lib/crud/custom-fields.js +4 -2
  20. package/dist/lib/crud/custom-fields.js.map +2 -2
  21. package/dist/lib/crud/enricher-runner.js +6 -10
  22. package/dist/lib/crud/enricher-runner.js.map +2 -2
  23. package/dist/lib/crud/factory.js +10 -8
  24. package/dist/lib/crud/factory.js.map +2 -2
  25. package/dist/lib/crud/interceptor-registry.js +3 -3
  26. package/dist/lib/crud/interceptor-registry.js.map +2 -2
  27. package/dist/lib/crud/mutation-guard.js +4 -2
  28. package/dist/lib/crud/mutation-guard.js.map +2 -2
  29. package/dist/lib/crud/optimistic-lock.js +5 -6
  30. package/dist/lib/crud/optimistic-lock.js.map +2 -2
  31. package/dist/lib/crud/route-mutation-guard.js +3 -1
  32. package/dist/lib/crud/route-mutation-guard.js.map +2 -2
  33. package/dist/lib/crud/sync-event-runner.js +3 -1
  34. package/dist/lib/crud/sync-event-runner.js.map +2 -2
  35. package/dist/lib/data/engine.js +5 -5
  36. package/dist/lib/data/engine.js.map +2 -2
  37. package/dist/lib/db/mikro.js +5 -3
  38. package/dist/lib/db/mikro.js.map +2 -2
  39. package/dist/lib/di/container.js +3 -1
  40. package/dist/lib/di/container.js.map +2 -2
  41. package/dist/lib/encryption/aes.js +3 -1
  42. package/dist/lib/encryption/aes.js.map +2 -2
  43. package/dist/lib/encryption/entityFields.js +3 -1
  44. package/dist/lib/encryption/entityFields.js.map +2 -2
  45. package/dist/lib/encryption/entityIds.js +3 -1
  46. package/dist/lib/encryption/entityIds.js.map +2 -2
  47. package/dist/lib/encryption/kms.js +25 -32
  48. package/dist/lib/encryption/kms.js.map +2 -2
  49. package/dist/lib/encryption/subscriber.js +3 -1
  50. package/dist/lib/encryption/subscriber.js.map +2 -2
  51. package/dist/lib/encryption/tenantDataEncryptionService.js +3 -1
  52. package/dist/lib/encryption/tenantDataEncryptionService.js.map +2 -2
  53. package/dist/lib/indexers/error-log.js +4 -2
  54. package/dist/lib/indexers/error-log.js.map +2 -2
  55. package/dist/lib/indexers/status-log.js +5 -3
  56. package/dist/lib/indexers/status-log.js.map +2 -2
  57. package/dist/lib/logger/index.js +28 -0
  58. package/dist/lib/logger/index.js.map +7 -0
  59. package/dist/lib/logger/level.js +43 -0
  60. package/dist/lib/logger/level.js.map +7 -0
  61. package/dist/lib/logger/transport.console.js +39 -0
  62. package/dist/lib/logger/transport.console.js.map +7 -0
  63. package/dist/lib/logger/transport.js +17 -0
  64. package/dist/lib/logger/transport.js.map +7 -0
  65. package/dist/lib/logger/transport.pretty.js +85 -0
  66. package/dist/lib/logger/transport.pretty.js.map +7 -0
  67. package/dist/lib/logger/transport.server.js +85 -0
  68. package/dist/lib/logger/transport.server.js.map +7 -0
  69. package/dist/lib/middleware/page-executor.js +3 -1
  70. package/dist/lib/middleware/page-executor.js.map +2 -2
  71. package/dist/lib/modules/registry.js +3 -1
  72. package/dist/lib/modules/registry.js.map +2 -2
  73. package/dist/lib/profiler/index.js +3 -2
  74. package/dist/lib/profiler/index.js.map +2 -2
  75. package/dist/lib/query/engine.js +5 -6
  76. package/dist/lib/query/engine.js.map +2 -2
  77. package/dist/lib/query/query-extension-runner.js +5 -11
  78. package/dist/lib/query/query-extension-runner.js.map +2 -2
  79. package/dist/lib/redis/connection.js +3 -1
  80. package/dist/lib/redis/connection.js.map +2 -2
  81. package/dist/lib/url.js +7 -5
  82. package/dist/lib/url.js.map +2 -2
  83. package/dist/lib/version.js +1 -1
  84. package/dist/lib/version.js.map +1 -1
  85. package/dist/modules/analytics.js +3 -1
  86. package/dist/modules/analytics.js.map +2 -2
  87. package/dist/modules/dashboard/widgets.js +3 -1
  88. package/dist/modules/dashboard/widgets.js.map +2 -2
  89. package/dist/modules/events/factory.js +5 -3
  90. package/dist/modules/events/factory.js.map +2 -2
  91. package/dist/modules/overrides.js +16 -34
  92. package/dist/modules/overrides.js.map +2 -2
  93. package/dist/modules/registry.js +3 -1
  94. package/dist/modules/registry.js.map +2 -2
  95. package/dist/modules/search.js +3 -1
  96. package/dist/modules/search.js.map +2 -2
  97. package/dist/modules/widgets/injection-loader.js +6 -6
  98. package/dist/modules/widgets/injection-loader.js.map +2 -2
  99. package/dist/modules/widgets/injection-position.js +3 -1
  100. package/dist/modules/widgets/injection-position.js.map +2 -2
  101. package/package.json +7 -2
  102. package/src/lib/commands/__tests__/command-interceptor-runner.test.ts +19 -6
  103. package/src/lib/commands/__tests__/flush.test.ts +24 -15
  104. package/src/lib/commands/__tests__/normalizeAuthorUserId.test.ts +14 -2
  105. package/src/lib/commands/__tests__/registry.test.ts +17 -2
  106. package/src/lib/commands/__tests__/scope.test.ts +21 -9
  107. package/src/lib/commands/command-bus.ts +5 -2
  108. package/src/lib/commands/command-interceptor-runner.ts +5 -2
  109. package/src/lib/commands/flush.ts +4 -5
  110. package/src/lib/commands/helpers.ts +9 -2
  111. package/src/lib/commands/registry.ts +6 -3
  112. package/src/lib/commands/scope.ts +6 -3
  113. package/src/lib/crud/__tests__/optimistic-lock.test.ts +21 -6
  114. package/src/lib/crud/__tests__/route-mutation-guard.test.ts +17 -2
  115. package/src/lib/crud/__tests__/sync-event-runner.test.ts +17 -3
  116. package/src/lib/crud/advanced-filter-integration.ts +4 -1
  117. package/src/lib/crud/cache.ts +4 -1
  118. package/src/lib/crud/custom-fields.ts +5 -2
  119. package/src/lib/crud/enricher-runner.ts +7 -10
  120. package/src/lib/crud/factory.ts +11 -10
  121. package/src/lib/crud/interceptor-registry.ts +4 -3
  122. package/src/lib/crud/mutation-guard.ts +5 -2
  123. package/src/lib/crud/optimistic-lock.ts +6 -10
  124. package/src/lib/crud/route-mutation-guard.ts +4 -1
  125. package/src/lib/crud/sync-event-runner.ts +4 -1
  126. package/src/lib/data/__tests__/engine.event-validation.test.ts +26 -15
  127. package/src/lib/data/engine.ts +6 -6
  128. package/src/lib/db/mikro.ts +6 -3
  129. package/src/lib/di/container.ts +4 -1
  130. package/src/lib/encryption/aes.ts +4 -2
  131. package/src/lib/encryption/entityFields.ts +5 -1
  132. package/src/lib/encryption/entityIds.ts +4 -1
  133. package/src/lib/encryption/kms.ts +27 -33
  134. package/src/lib/encryption/subscriber.ts +4 -2
  135. package/src/lib/encryption/tenantDataEncryptionService.ts +4 -2
  136. package/src/lib/indexers/__tests__/status-log.test.ts +22 -10
  137. package/src/lib/indexers/error-log.ts +5 -2
  138. package/src/lib/indexers/status-log.ts +6 -3
  139. package/src/lib/logger/__tests__/logger.test.ts +539 -0
  140. package/src/lib/logger/index.ts +33 -0
  141. package/src/lib/logger/level.ts +50 -0
  142. package/src/lib/logger/transport.console.ts +41 -0
  143. package/src/lib/logger/transport.pretty.ts +94 -0
  144. package/src/lib/logger/transport.server.ts +125 -0
  145. package/src/lib/logger/transport.ts +17 -0
  146. package/src/lib/middleware/page-executor.ts +4 -1
  147. package/src/lib/modules/__tests__/registry.test.ts +28 -21
  148. package/src/lib/modules/registry.ts +4 -1
  149. package/src/lib/profiler/index.ts +4 -2
  150. package/src/lib/query/__tests__/query-extension-runner.test.ts +21 -7
  151. package/src/lib/query/engine.ts +7 -10
  152. package/src/lib/query/query-extension-runner.ts +6 -11
  153. package/src/lib/redis/connection.ts +5 -1
  154. package/src/lib/url.ts +10 -5
  155. package/src/modules/__tests__/overrides.test.ts +17 -3
  156. package/src/modules/__tests__/route-overrides.test.ts +29 -20
  157. package/src/modules/analytics.ts +5 -1
  158. package/src/modules/dashboard/widgets.ts +4 -1
  159. package/src/modules/events/factory.ts +6 -3
  160. package/src/modules/overrides.ts +18 -34
  161. package/src/modules/registry.ts +4 -1
  162. package/src/modules/search.ts +4 -1
  163. package/src/modules/widgets/injection-loader.ts +7 -6
  164. package/src/modules/widgets/injection-position.ts +5 -1
@@ -3,6 +3,9 @@ import type { CacheStrategy } from '@open-mercato/cache'
3
3
  import { decryptWithAesGcm, encryptWithAesGcm, hashForLookup } from './aes'
4
4
  import { createKmsService, type KmsService, type TenantDek } from './kms'
5
5
  import { isTenantDataEncryptionEnabled, isEncryptionDebugEnabled } from './toggles'
6
+ import { createLogger } from '../logger'
7
+
8
+ const logger = createLogger('shared').child({ component: 'tenant-encryption' })
6
9
 
7
10
  export type EncryptedFieldRule = {
8
11
  field: string
@@ -42,8 +45,7 @@ function cacheKey(key: MapCacheKey): string {
42
45
  function debug(event: string, payload: Record<string, unknown>) {
43
46
  if (!isEncryptionDebugEnabled()) return
44
47
  try {
45
- // eslint-disable-next-line no-console
46
- console.debug(`${event} [tenant-encryption]`, payload)
48
+ logger.debug(event, payload)
47
49
  } catch {
48
50
  // ignore
49
51
  }
@@ -1,4 +1,20 @@
1
1
  import { recordIndexerLog } from '../status-log'
2
+ import { createLogger } from '@open-mercato/shared/lib/logger'
3
+
4
+ jest.mock('@open-mercato/shared/lib/logger', () => {
5
+ const mocked = {
6
+ debug: jest.fn(),
7
+ info: jest.fn(),
8
+ warn: jest.fn(),
9
+ error: jest.fn(),
10
+ child: jest.fn(),
11
+ }
12
+ mocked.child.mockImplementation(() => mocked)
13
+ return { createLogger: jest.fn(() => mocked) }
14
+ })
15
+ const loggerError = createLogger('shared').error as jest.Mock
16
+ const loggerWarn = createLogger('shared').warn as jest.Mock
17
+
2
18
 
3
19
  type Behaviors = {
4
20
  insert?: () => unknown
@@ -29,17 +45,13 @@ function makeDb(behaviors: Behaviors): any {
29
45
  const INPUT = { source: 'vector' as const, handler: 'event:test', message: 'hi' }
30
46
 
31
47
  describe('recordIndexerLog — inactive-transaction de-noising', () => {
32
- let errorSpy: jest.SpyInstance
33
- let warnSpy: jest.SpyInstance
34
48
 
35
49
  beforeEach(() => {
36
- errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {})
37
- warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {})
50
+ loggerError.mockClear()
51
+ loggerWarn.mockClear()
38
52
  })
39
53
 
40
54
  afterEach(() => {
41
- errorSpy.mockRestore()
42
- warnSpy.mockRestore()
43
55
  })
44
56
 
45
57
  it('skips quietly when the insert hits an already-committed transaction', async () => {
@@ -51,7 +63,7 @@ describe('recordIndexerLog — inactive-transaction de-noising', () => {
51
63
 
52
64
  await recordIndexerLog({ db }, INPUT)
53
65
 
54
- expect(errorSpy).not.toHaveBeenCalled()
66
+ expect(loggerError).not.toHaveBeenCalled()
55
67
  })
56
68
 
57
69
  it('still logs an unexpected insert failure', async () => {
@@ -63,7 +75,7 @@ describe('recordIndexerLog — inactive-transaction de-noising', () => {
63
75
 
64
76
  await recordIndexerLog({ db }, INPUT)
65
77
 
66
- expect(errorSpy).toHaveBeenCalledTimes(1)
78
+ expect(loggerError).toHaveBeenCalledTimes(1)
67
79
  })
68
80
 
69
81
  it('skips quietly when the prune hits a rolled-back transaction', async () => {
@@ -76,7 +88,7 @@ describe('recordIndexerLog — inactive-transaction de-noising', () => {
76
88
 
77
89
  await recordIndexerLog({ db }, INPUT)
78
90
 
79
- expect(warnSpy).not.toHaveBeenCalled()
91
+ expect(loggerWarn).not.toHaveBeenCalled()
80
92
  })
81
93
 
82
94
  it('still warns on an unexpected prune failure', async () => {
@@ -89,6 +101,6 @@ describe('recordIndexerLog — inactive-transaction de-noising', () => {
89
101
 
90
102
  await recordIndexerLog({ db }, INPUT)
91
103
 
92
- expect(warnSpy).toHaveBeenCalledTimes(1)
104
+ expect(loggerWarn).toHaveBeenCalledTimes(1)
93
105
  })
94
106
  })
@@ -1,5 +1,8 @@
1
1
  import type { EntityManager } from '@mikro-orm/postgresql'
2
2
  import { type Kysely, sql } from 'kysely'
3
+ import { createLogger } from '../logger'
4
+
5
+ const logger = createLogger('shared').child({ component: 'indexers' })
3
6
 
4
7
  export type IndexerErrorSource = 'query_index' | 'vector' | 'fulltext'
5
8
 
@@ -73,7 +76,7 @@ function pickDb(deps: RecordIndexerErrorDeps): Kysely<any> | null {
73
76
  export async function recordIndexerError(deps: RecordIndexerErrorDeps, input: RecordIndexerErrorInput): Promise<void> {
74
77
  const db = pickDb(deps)
75
78
  if (!db) {
76
- console.error('[indexers] Unable to record indexer error (missing db connection)', {
79
+ logger.error('Unable to record indexer error (missing db connection)', {
77
80
  source: input.source,
78
81
  handler: input.handler,
79
82
  })
@@ -101,6 +104,6 @@ export async function recordIndexerError(deps: RecordIndexerErrorDeps, input: Re
101
104
  } as any)
102
105
  .execute()
103
106
  } catch (loggingError) {
104
- console.error('[indexers] Failed to persist indexer error', loggingError)
107
+ logger.error('Failed to persist indexer error', { err: loggingError })
105
108
  }
106
109
  }
@@ -1,6 +1,9 @@
1
1
  import type { EntityManager } from '@mikro-orm/postgresql'
2
2
  import { type Kysely, sql } from 'kysely'
3
3
  import type { IndexerErrorSource } from './error-log'
4
+ import { createLogger } from '../logger'
5
+
6
+ const logger = createLogger('shared').child({ component: 'indexers' })
4
7
 
5
8
  export type IndexerLogLevel = 'info' | 'warn'
6
9
 
@@ -96,7 +99,7 @@ export async function recordIndexerLog(
96
99
  ): Promise<void> {
97
100
  const db = pickDb(deps)
98
101
  if (!db) {
99
- console.warn('[indexers] Unable to record indexer log (missing db connection)', {
102
+ logger.warn('Unable to record indexer log (missing db connection)', {
100
103
  source: input.source,
101
104
  handler: input.handler,
102
105
  })
@@ -128,7 +131,7 @@ export async function recordIndexerLog(
128
131
  // A committed/rolled-back caller transaction is an expected, harmless
129
132
  // condition for best-effort logging — skip quietly instead of surfacing it.
130
133
  if (!isInactiveTransactionError(error)) {
131
- console.error('[indexers] Failed to persist indexer log', error)
134
+ logger.error('Failed to persist indexer log', { err: error })
132
135
  }
133
136
  return
134
137
  }
@@ -137,7 +140,7 @@ export async function recordIndexerLog(
137
140
  await pruneExcessLogs(db, input.source)
138
141
  } catch (pruneError) {
139
142
  if (!isInactiveTransactionError(pruneError)) {
140
- console.warn('[indexers] Failed to prune indexer logs', pruneError)
143
+ logger.warn('Failed to prune indexer logs', { err: pruneError })
141
144
  }
142
145
  }
143
146
  }