@open-mercato/shared 0.6.6-develop.6465.1.019f0fb26f → 0.6.6-develop.6472.1.1673e7e66b
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.
- package/.turbo/turbo-build.log +1 -1
- package/AGENTS.md +1 -0
- package/dist/lib/commands/command-bus.js +4 -2
- package/dist/lib/commands/command-bus.js.map +2 -2
- package/dist/lib/commands/command-interceptor-runner.js +4 -2
- package/dist/lib/commands/command-interceptor-runner.js.map +2 -2
- package/dist/lib/commands/flush.js +3 -4
- package/dist/lib/commands/flush.js.map +2 -2
- package/dist/lib/commands/helpers.js +3 -1
- package/dist/lib/commands/helpers.js.map +2 -2
- package/dist/lib/commands/registry.js +5 -3
- package/dist/lib/commands/registry.js.map +2 -2
- package/dist/lib/commands/scope.js +5 -3
- package/dist/lib/commands/scope.js.map +2 -2
- package/dist/lib/crud/advanced-filter-integration.js +3 -1
- package/dist/lib/crud/advanced-filter-integration.js.map +2 -2
- package/dist/lib/crud/cache.js +3 -1
- package/dist/lib/crud/cache.js.map +2 -2
- package/dist/lib/crud/custom-fields.js +4 -2
- package/dist/lib/crud/custom-fields.js.map +2 -2
- package/dist/lib/crud/enricher-runner.js +6 -10
- package/dist/lib/crud/enricher-runner.js.map +2 -2
- package/dist/lib/crud/factory.js +10 -8
- package/dist/lib/crud/factory.js.map +2 -2
- package/dist/lib/crud/interceptor-registry.js +3 -3
- package/dist/lib/crud/interceptor-registry.js.map +2 -2
- package/dist/lib/crud/mutation-guard.js +4 -2
- package/dist/lib/crud/mutation-guard.js.map +2 -2
- package/dist/lib/crud/optimistic-lock.js +5 -6
- package/dist/lib/crud/optimistic-lock.js.map +2 -2
- package/dist/lib/crud/route-mutation-guard.js +3 -1
- package/dist/lib/crud/route-mutation-guard.js.map +2 -2
- package/dist/lib/crud/sync-event-runner.js +3 -1
- package/dist/lib/crud/sync-event-runner.js.map +2 -2
- package/dist/lib/data/engine.js +5 -5
- package/dist/lib/data/engine.js.map +2 -2
- package/dist/lib/db/mikro.js +5 -3
- package/dist/lib/db/mikro.js.map +2 -2
- package/dist/lib/di/container.js +3 -1
- package/dist/lib/di/container.js.map +2 -2
- package/dist/lib/encryption/aes.js +3 -1
- package/dist/lib/encryption/aes.js.map +2 -2
- package/dist/lib/encryption/entityFields.js +3 -1
- package/dist/lib/encryption/entityFields.js.map +2 -2
- package/dist/lib/encryption/entityIds.js +3 -1
- package/dist/lib/encryption/entityIds.js.map +2 -2
- package/dist/lib/encryption/kms.js +25 -32
- package/dist/lib/encryption/kms.js.map +2 -2
- package/dist/lib/encryption/subscriber.js +3 -1
- package/dist/lib/encryption/subscriber.js.map +2 -2
- package/dist/lib/encryption/tenantDataEncryptionService.js +3 -1
- package/dist/lib/encryption/tenantDataEncryptionService.js.map +2 -2
- package/dist/lib/indexers/error-log.js +4 -2
- package/dist/lib/indexers/error-log.js.map +2 -2
- package/dist/lib/indexers/status-log.js +5 -3
- package/dist/lib/indexers/status-log.js.map +2 -2
- package/dist/lib/logger/index.js +28 -0
- package/dist/lib/logger/index.js.map +7 -0
- package/dist/lib/logger/level.js +43 -0
- package/dist/lib/logger/level.js.map +7 -0
- package/dist/lib/logger/transport.console.js +39 -0
- package/dist/lib/logger/transport.console.js.map +7 -0
- package/dist/lib/logger/transport.js +17 -0
- package/dist/lib/logger/transport.js.map +7 -0
- package/dist/lib/logger/transport.pretty.js +85 -0
- package/dist/lib/logger/transport.pretty.js.map +7 -0
- package/dist/lib/logger/transport.server.js +85 -0
- package/dist/lib/logger/transport.server.js.map +7 -0
- package/dist/lib/middleware/page-executor.js +3 -1
- package/dist/lib/middleware/page-executor.js.map +2 -2
- package/dist/lib/modules/registry.js +3 -1
- package/dist/lib/modules/registry.js.map +2 -2
- package/dist/lib/profiler/index.js +3 -2
- package/dist/lib/profiler/index.js.map +2 -2
- package/dist/lib/query/engine.js +5 -6
- package/dist/lib/query/engine.js.map +2 -2
- package/dist/lib/query/query-extension-runner.js +5 -11
- package/dist/lib/query/query-extension-runner.js.map +2 -2
- package/dist/lib/redis/connection.js +3 -1
- package/dist/lib/redis/connection.js.map +2 -2
- package/dist/lib/url.js +7 -5
- package/dist/lib/url.js.map +2 -2
- package/dist/lib/version.js +1 -1
- package/dist/lib/version.js.map +1 -1
- package/dist/modules/analytics.js +3 -1
- package/dist/modules/analytics.js.map +2 -2
- package/dist/modules/dashboard/widgets.js +3 -1
- package/dist/modules/dashboard/widgets.js.map +2 -2
- package/dist/modules/events/factory.js +5 -3
- package/dist/modules/events/factory.js.map +2 -2
- package/dist/modules/overrides.js +16 -34
- package/dist/modules/overrides.js.map +2 -2
- package/dist/modules/registry.js +3 -1
- package/dist/modules/registry.js.map +2 -2
- package/dist/modules/search.js +3 -1
- package/dist/modules/search.js.map +2 -2
- package/dist/modules/widgets/injection-loader.js +6 -6
- package/dist/modules/widgets/injection-loader.js.map +2 -2
- package/dist/modules/widgets/injection-position.js +3 -1
- package/dist/modules/widgets/injection-position.js.map +2 -2
- package/package.json +7 -2
- package/src/lib/commands/__tests__/command-interceptor-runner.test.ts +19 -6
- package/src/lib/commands/__tests__/flush.test.ts +24 -15
- package/src/lib/commands/__tests__/normalizeAuthorUserId.test.ts +14 -2
- package/src/lib/commands/__tests__/registry.test.ts +17 -2
- package/src/lib/commands/__tests__/scope.test.ts +21 -9
- package/src/lib/commands/command-bus.ts +5 -2
- package/src/lib/commands/command-interceptor-runner.ts +5 -2
- package/src/lib/commands/flush.ts +4 -5
- package/src/lib/commands/helpers.ts +9 -2
- package/src/lib/commands/registry.ts +6 -3
- package/src/lib/commands/scope.ts +6 -3
- package/src/lib/crud/__tests__/optimistic-lock.test.ts +21 -6
- package/src/lib/crud/__tests__/route-mutation-guard.test.ts +17 -2
- package/src/lib/crud/__tests__/sync-event-runner.test.ts +17 -3
- package/src/lib/crud/advanced-filter-integration.ts +4 -1
- package/src/lib/crud/cache.ts +4 -1
- package/src/lib/crud/custom-fields.ts +5 -2
- package/src/lib/crud/enricher-runner.ts +7 -10
- package/src/lib/crud/factory.ts +11 -10
- package/src/lib/crud/interceptor-registry.ts +4 -3
- package/src/lib/crud/mutation-guard.ts +5 -2
- package/src/lib/crud/optimistic-lock.ts +6 -10
- package/src/lib/crud/route-mutation-guard.ts +4 -1
- package/src/lib/crud/sync-event-runner.ts +4 -1
- package/src/lib/data/__tests__/engine.event-validation.test.ts +26 -15
- package/src/lib/data/engine.ts +6 -6
- package/src/lib/db/mikro.ts +6 -3
- package/src/lib/di/container.ts +4 -1
- package/src/lib/encryption/aes.ts +4 -2
- package/src/lib/encryption/entityFields.ts +5 -1
- package/src/lib/encryption/entityIds.ts +4 -1
- package/src/lib/encryption/kms.ts +27 -33
- package/src/lib/encryption/subscriber.ts +4 -2
- package/src/lib/encryption/tenantDataEncryptionService.ts +4 -2
- package/src/lib/indexers/__tests__/status-log.test.ts +22 -10
- package/src/lib/indexers/error-log.ts +5 -2
- package/src/lib/indexers/status-log.ts +6 -3
- package/src/lib/logger/__tests__/logger.test.ts +539 -0
- package/src/lib/logger/index.ts +33 -0
- package/src/lib/logger/level.ts +50 -0
- package/src/lib/logger/transport.console.ts +41 -0
- package/src/lib/logger/transport.pretty.ts +94 -0
- package/src/lib/logger/transport.server.ts +125 -0
- package/src/lib/logger/transport.ts +17 -0
- package/src/lib/middleware/page-executor.ts +4 -1
- package/src/lib/modules/__tests__/registry.test.ts +28 -21
- package/src/lib/modules/registry.ts +4 -1
- package/src/lib/profiler/index.ts +4 -2
- package/src/lib/query/__tests__/query-extension-runner.test.ts +21 -7
- package/src/lib/query/engine.ts +7 -10
- package/src/lib/query/query-extension-runner.ts +6 -11
- package/src/lib/redis/connection.ts +5 -1
- package/src/lib/url.ts +10 -5
- package/src/modules/__tests__/overrides.test.ts +17 -3
- package/src/modules/__tests__/route-overrides.test.ts +29 -20
- package/src/modules/analytics.ts +5 -1
- package/src/modules/dashboard/widgets.ts +4 -1
- package/src/modules/events/factory.ts +6 -3
- package/src/modules/overrides.ts +18 -34
- package/src/modules/registry.ts +4 -1
- package/src/modules/search.ts +4 -1
- package/src/modules/widgets/injection-loader.ts +7 -6
- package/src/modules/widgets/injection-position.ts +5 -1
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { parseBooleanToken } from "../boolean.js";
|
|
2
|
+
import { createLogger } from "../logger/index.js";
|
|
3
|
+
const logger = createLogger("shared").child({ component: "profiler" });
|
|
2
4
|
const ROUND_PRECISION = 1e3;
|
|
3
5
|
const NS_PER_MS = BigInt(1e6);
|
|
4
6
|
const BIGINT_ZERO = BigInt(0);
|
|
@@ -166,9 +168,8 @@ class ProfilerImpl {
|
|
|
166
168
|
if (this.root.meta && Object.keys(this.root.meta).length > 0) {
|
|
167
169
|
snapshot.meta = this.root.meta;
|
|
168
170
|
}
|
|
169
|
-
const serialized = JSON.stringify(snapshot, null, 2);
|
|
170
171
|
try {
|
|
171
|
-
|
|
172
|
+
logger.info("Profiler snapshot", { label: this.root.loggerLabel, snapshot });
|
|
172
173
|
} catch {
|
|
173
174
|
}
|
|
174
175
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/lib/profiler/index.ts"],
|
|
4
|
-
"sourcesContent": ["import { parseBooleanToken } from '../boolean'\n\nconst ROUND_PRECISION = 1000\nconst NS_PER_MS = BigInt(1_000_000)\nconst BIGINT_ZERO = BigInt(0)\n\nexport type ProfilerExtra = Record<string, unknown>\n\nexport type ProfilerSnapshotNode = {\n label: string\n durationMs: number\n extra?: ProfilerExtra\n children?: ProfilerSnapshotNode[]\n type?: 'mark' | 'span' | 'record'\n}\n\nexport type ProfilerSnapshot = {\n scope: string\n target?: string\n totalMs: number\n tree: ProfilerSnapshotNode[]\n meta?: ProfilerExtra\n}\n\nexport type ProfilerSection = {\n end: (extra?: ProfilerExtra) => void\n}\n\nexport type Profiler = {\n readonly enabled: boolean\n mark: (label: string, extra?: ProfilerExtra) => void\n section: (label: string, extra?: ProfilerExtra) => ProfilerSection\n measure: <T>(\n label: string,\n fn: () => Promise<T> | T,\n extra?: ((result: T) => ProfilerExtra | undefined) | ProfilerExtra\n ) => Promise<T>\n record: (label: string, durationMs: number, extra?: ProfilerExtra) => void\n child: (label: string, extra?: ProfilerExtra) => Profiler\n end: (extra?: ProfilerExtra) => void\n}\n\ntype ProfilerNodeCommon = {\n label: string\n start: bigint\n durationNs: bigint\n extra?: ProfilerExtra\n type: 'mark' | 'span' | 'record'\n}\n\ntype ProfilerSpanNode = ProfilerNodeCommon & {\n type: 'span'\n children: ProfilerInternalNode[]\n lastTimestamp: bigint\n closed: boolean\n}\n\ntype ProfilerMarkNode = ProfilerNodeCommon & { type: 'mark' }\ntype ProfilerRecordNode = ProfilerNodeCommon & { type: 'record' }\n\ntype ProfilerInternalNode = ProfilerSpanNode | ProfilerMarkNode | ProfilerRecordNode\n\ntype ProfilerRootState = {\n scope: string\n target?: string\n label: string\n loggerLabel: string\n enabled: boolean\n startedAt: bigint\n lastTimestamp: bigint\n nodes: ProfilerInternalNode[]\n closed: boolean\n meta?: ProfilerExtra\n}\n\ntype ProfilerImplOptions = {\n root: ProfilerRootState\n span?: ProfilerSpanNode\n parent?: ProfilerImpl\n}\n\nfunction now(): bigint {\n return process.hrtime.bigint()\n}\n\nfunction roundDuration(ns: bigint): number {\n if (ns <= BIGINT_ZERO) return 0\n const ms = Number(ns) / Number(NS_PER_MS)\n return Math.round(ms * ROUND_PRECISION) / ROUND_PRECISION\n}\n\nfunction mergeExtra(base: ProfilerExtra | undefined, extra: ProfilerExtra | undefined): ProfilerExtra | undefined {\n if (!base && !extra) return undefined\n if (!base) return extra ? { ...extra } : undefined\n if (!extra) return base ? { ...base } : undefined\n return { ...base, ...extra }\n}\n\nfunction serializeNode(node: ProfilerInternalNode): ProfilerSnapshotNode {\n const base: ProfilerSnapshotNode = {\n label: node.label,\n durationMs: roundDuration(node.durationNs),\n }\n if (node.extra && Object.keys(node.extra).length > 0) {\n base.extra = node.extra\n }\n base.type = node.type\n if (node.type === 'span' && node.children.length > 0) {\n base.children = node.children.map(serializeNode)\n }\n return base\n}\n\nclass ProfilerImpl implements Profiler {\n private span?: ProfilerSpanNode\n private parent?: ProfilerImpl\n private root: ProfilerRootState\n private lastTimestamp: bigint\n private closed = false\n\n constructor(options: ProfilerImplOptions) {\n this.root = options.root\n this.span = options.span\n this.parent = options.parent\n this.lastTimestamp = options.span ? options.span.lastTimestamp : options.root.lastTimestamp\n }\n\n get enabled(): boolean {\n return this.root.enabled\n }\n\n mark(label: string, extra?: ProfilerExtra) {\n if (!this.enabled || this.closed) return\n const timestamp = now()\n const duration = timestamp - this.lastTimestamp\n const node: ProfilerMarkNode = {\n type: 'mark',\n label,\n start: timestamp,\n durationNs: duration >= BIGINT_ZERO ? duration : BIGINT_ZERO,\n extra: extra ? { ...extra } : undefined,\n }\n this.appendNode(node)\n this.updateTimestamps(timestamp)\n }\n\n section(label: string, extra?: ProfilerExtra): ProfilerSection {\n if (!this.enabled || this.closed) {\n return disabledSection\n }\n const child = this.child(label, extra)\n return {\n end: (childExtra?: ProfilerExtra) => child.end(childExtra),\n }\n }\n\n async measure<T>(\n label: string,\n fn: () => Promise<T> | T,\n extra?: ((result: T) => ProfilerExtra | undefined) | ProfilerExtra\n ): Promise<T> {\n if (!this.enabled || this.closed) {\n return Promise.resolve(fn())\n }\n const child = this.child(label)\n try {\n const result = await Promise.resolve(fn())\n const payload = typeof extra === 'function' ? extra(result) : extra\n child.end(payload)\n return result\n } catch (err) {\n child.end({ error: err instanceof Error ? err.message : String(err) })\n throw err\n }\n }\n\n record(label: string, durationMs: number, extra?: ProfilerExtra) {\n if (!this.enabled || this.closed) return\n const safeDurationMs = Number.isFinite(durationMs) && durationMs > 0 ? durationMs : 0\n const durationNs = BigInt(Math.round(safeDurationMs * Number(NS_PER_MS)))\n const node: ProfilerRecordNode = {\n type: 'record',\n label,\n start: this.lastTimestamp,\n durationNs: durationNs >= BIGINT_ZERO ? durationNs : BIGINT_ZERO,\n extra: extra ? { ...extra } : undefined,\n }\n this.appendNode(node)\n this.updateTimestamps(this.lastTimestamp + node.durationNs)\n }\n\n child(label: string, extra?: ProfilerExtra): Profiler {\n if (!this.enabled || this.closed) return disabledProfiler\n const timestamp = now()\n const span: ProfilerSpanNode = {\n type: 'span',\n label,\n start: timestamp,\n durationNs: BIGINT_ZERO,\n extra: extra ? { ...extra } : undefined,\n children: [],\n lastTimestamp: timestamp,\n closed: false,\n }\n this.appendNode(span)\n this.updateTimestamps(timestamp)\n return new ProfilerImpl({ root: this.root, span, parent: this })\n }\n\n end(extra?: ProfilerExtra) {\n if (!this.enabled || this.closed) return\n const current = now()\n if (this.span) {\n this.closeSpan(current, extra)\n } else {\n this.closeRoot(current, extra)\n }\n }\n\n private appendNode(node: ProfilerInternalNode) {\n if (this.span) {\n this.span.children.push(node)\n this.span.lastTimestamp = node.start\n } else {\n this.root.nodes.push(node)\n }\n }\n\n private updateTimestamps(newTimestamp: bigint) {\n if (this.span) {\n this.span.lastTimestamp = newTimestamp\n } else {\n this.root.lastTimestamp = newTimestamp\n }\n this.lastTimestamp = newTimestamp\n }\n\n private closeSpan(closedAt: bigint, extra?: ProfilerExtra) {\n if (!this.span || this.span.closed) return\n const effectiveEnd = closedAt >= this.span.start ? closedAt : this.span.start\n this.span.durationNs = effectiveEnd - this.span.start\n this.span.extra = mergeExtra(this.span.extra, extra)\n this.span.closed = true\n this.closed = true\n this.updateTimestamps(effectiveEnd)\n if (this.parent) {\n this.parent.updateTimestamps(effectiveEnd)\n } else {\n this.root.lastTimestamp = effectiveEnd\n }\n }\n\n private closeRoot(closedAt: bigint, extra?: ProfilerExtra) {\n if (this.root.closed) return\n const endTime = closedAt >= this.root.startedAt ? closedAt : this.root.startedAt\n this.root.lastTimestamp = endTime\n this.root.meta = mergeExtra(this.root.meta, extra)\n this.root.closed = true\n this.closed = true\n const totalNs = endTime - this.root.startedAt\n const snapshot: ProfilerSnapshot = {\n scope: this.root.scope,\n target: this.root.target,\n totalMs: roundDuration(totalNs),\n tree: this.root.nodes.map(serializeNode),\n }\n if (this.root.meta && Object.keys(this.root.meta).length > 0) {\n snapshot.meta = this.root.meta\n }\n const serialized = JSON.stringify(snapshot, null, 2)\n try {\n console.info(this.root.loggerLabel, serialized)\n } catch {\n // ignore logging failures\n }\n }\n}\n\nconst disabledSection: ProfilerSection = { end: () => {} }\n\nconst disabledProfiler: Profiler = {\n get enabled() {\n return false\n },\n mark: () => {},\n section: () => disabledSection,\n measure: async (_label, fn) => Promise.resolve(fn()),\n record: () => {},\n child: () => disabledProfiler,\n end: () => {},\n}\n\nexport type CreateProfilerOptions = {\n scope: string\n target?: string\n label?: string\n enabled?: boolean\n loggerLabel?: string\n meta?: ProfilerExtra\n}\n\nexport function createProfiler(options: CreateProfilerOptions): Profiler {\n if (options.enabled === false) return disabledProfiler\n const startedAt = now()\n const enabledFlag = options.enabled !== undefined ? options.enabled : true\n const root: ProfilerRootState = {\n scope: options.scope,\n target: options.target,\n label: options.label ?? options.scope,\n loggerLabel: options.loggerLabel ?? '[profile]',\n enabled: enabledFlag,\n startedAt,\n lastTimestamp: startedAt,\n nodes: [],\n closed: false,\n meta: options.meta ? { ...options.meta } : undefined,\n }\n return new ProfilerImpl({ root })\n}\n\nexport function normalizeProfilerTokens(input: string | null | undefined): string[] {\n if (!input) return []\n return input\n .split(',')\n .map((token) => token.trim().toLowerCase())\n .filter((token) => token.length > 0)\n}\n\nexport function profilerMatches(target: string, tokens: string[]): boolean {\n if (!tokens.length) return false\n const lower = target.toLowerCase()\n return tokens.some((token) => {\n if (token === '*' || token === 'all' || parseBooleanToken(token) === true) return true\n if (token.endsWith('*')) {\n const prefix = token.slice(0, -1)\n return prefix.length === 0 ? true : lower.startsWith(prefix)\n }\n return token === lower\n })\n}\n\nconst DEFAULT_ENV_KEYS = [\n 'OM_PROFILE',\n 'NEXT_PUBLIC_OM_PROFILE',\n 'OM_CRUD_PROFILE',\n 'NEXT_PUBLIC_OM_CRUD_PROFILE',\n 'OM_QE_PROFILE',\n 'NEXT_PUBLIC_OM_QE_PROFILE',\n] as const\n\nexport function resolveProfilerTokens(envKeys: readonly string[] = DEFAULT_ENV_KEYS): string[] {\n const tokens: string[] = []\n envKeys.forEach((key) => {\n const raw = process.env[key]\n if (!raw) return\n const parsed = normalizeProfilerTokens(raw)\n if (parsed.length) tokens.push(...parsed)\n })\n return Array.from(new Set(tokens))\n}\n\nexport function shouldEnableProfiler(\n target: string,\n options?: { tokens?: string[]; envKeys?: readonly string[] }\n): boolean {\n const tokens = options?.tokens ?? resolveProfilerTokens(options?.envKeys)\n if (!tokens.length) return false\n return profilerMatches(target, tokens)\n}\n\nexport const disabledProfilerInstance = disabledProfiler\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,yBAAyB;
|
|
4
|
+
"sourcesContent": ["import { parseBooleanToken } from '../boolean'\nimport { createLogger } from '../logger'\n\nconst logger = createLogger('shared').child({ component: 'profiler' })\n\nconst ROUND_PRECISION = 1000\nconst NS_PER_MS = BigInt(1_000_000)\nconst BIGINT_ZERO = BigInt(0)\n\nexport type ProfilerExtra = Record<string, unknown>\n\nexport type ProfilerSnapshotNode = {\n label: string\n durationMs: number\n extra?: ProfilerExtra\n children?: ProfilerSnapshotNode[]\n type?: 'mark' | 'span' | 'record'\n}\n\nexport type ProfilerSnapshot = {\n scope: string\n target?: string\n totalMs: number\n tree: ProfilerSnapshotNode[]\n meta?: ProfilerExtra\n}\n\nexport type ProfilerSection = {\n end: (extra?: ProfilerExtra) => void\n}\n\nexport type Profiler = {\n readonly enabled: boolean\n mark: (label: string, extra?: ProfilerExtra) => void\n section: (label: string, extra?: ProfilerExtra) => ProfilerSection\n measure: <T>(\n label: string,\n fn: () => Promise<T> | T,\n extra?: ((result: T) => ProfilerExtra | undefined) | ProfilerExtra\n ) => Promise<T>\n record: (label: string, durationMs: number, extra?: ProfilerExtra) => void\n child: (label: string, extra?: ProfilerExtra) => Profiler\n end: (extra?: ProfilerExtra) => void\n}\n\ntype ProfilerNodeCommon = {\n label: string\n start: bigint\n durationNs: bigint\n extra?: ProfilerExtra\n type: 'mark' | 'span' | 'record'\n}\n\ntype ProfilerSpanNode = ProfilerNodeCommon & {\n type: 'span'\n children: ProfilerInternalNode[]\n lastTimestamp: bigint\n closed: boolean\n}\n\ntype ProfilerMarkNode = ProfilerNodeCommon & { type: 'mark' }\ntype ProfilerRecordNode = ProfilerNodeCommon & { type: 'record' }\n\ntype ProfilerInternalNode = ProfilerSpanNode | ProfilerMarkNode | ProfilerRecordNode\n\ntype ProfilerRootState = {\n scope: string\n target?: string\n label: string\n loggerLabel: string\n enabled: boolean\n startedAt: bigint\n lastTimestamp: bigint\n nodes: ProfilerInternalNode[]\n closed: boolean\n meta?: ProfilerExtra\n}\n\ntype ProfilerImplOptions = {\n root: ProfilerRootState\n span?: ProfilerSpanNode\n parent?: ProfilerImpl\n}\n\nfunction now(): bigint {\n return process.hrtime.bigint()\n}\n\nfunction roundDuration(ns: bigint): number {\n if (ns <= BIGINT_ZERO) return 0\n const ms = Number(ns) / Number(NS_PER_MS)\n return Math.round(ms * ROUND_PRECISION) / ROUND_PRECISION\n}\n\nfunction mergeExtra(base: ProfilerExtra | undefined, extra: ProfilerExtra | undefined): ProfilerExtra | undefined {\n if (!base && !extra) return undefined\n if (!base) return extra ? { ...extra } : undefined\n if (!extra) return base ? { ...base } : undefined\n return { ...base, ...extra }\n}\n\nfunction serializeNode(node: ProfilerInternalNode): ProfilerSnapshotNode {\n const base: ProfilerSnapshotNode = {\n label: node.label,\n durationMs: roundDuration(node.durationNs),\n }\n if (node.extra && Object.keys(node.extra).length > 0) {\n base.extra = node.extra\n }\n base.type = node.type\n if (node.type === 'span' && node.children.length > 0) {\n base.children = node.children.map(serializeNode)\n }\n return base\n}\n\nclass ProfilerImpl implements Profiler {\n private span?: ProfilerSpanNode\n private parent?: ProfilerImpl\n private root: ProfilerRootState\n private lastTimestamp: bigint\n private closed = false\n\n constructor(options: ProfilerImplOptions) {\n this.root = options.root\n this.span = options.span\n this.parent = options.parent\n this.lastTimestamp = options.span ? options.span.lastTimestamp : options.root.lastTimestamp\n }\n\n get enabled(): boolean {\n return this.root.enabled\n }\n\n mark(label: string, extra?: ProfilerExtra) {\n if (!this.enabled || this.closed) return\n const timestamp = now()\n const duration = timestamp - this.lastTimestamp\n const node: ProfilerMarkNode = {\n type: 'mark',\n label,\n start: timestamp,\n durationNs: duration >= BIGINT_ZERO ? duration : BIGINT_ZERO,\n extra: extra ? { ...extra } : undefined,\n }\n this.appendNode(node)\n this.updateTimestamps(timestamp)\n }\n\n section(label: string, extra?: ProfilerExtra): ProfilerSection {\n if (!this.enabled || this.closed) {\n return disabledSection\n }\n const child = this.child(label, extra)\n return {\n end: (childExtra?: ProfilerExtra) => child.end(childExtra),\n }\n }\n\n async measure<T>(\n label: string,\n fn: () => Promise<T> | T,\n extra?: ((result: T) => ProfilerExtra | undefined) | ProfilerExtra\n ): Promise<T> {\n if (!this.enabled || this.closed) {\n return Promise.resolve(fn())\n }\n const child = this.child(label)\n try {\n const result = await Promise.resolve(fn())\n const payload = typeof extra === 'function' ? extra(result) : extra\n child.end(payload)\n return result\n } catch (err) {\n child.end({ error: err instanceof Error ? err.message : String(err) })\n throw err\n }\n }\n\n record(label: string, durationMs: number, extra?: ProfilerExtra) {\n if (!this.enabled || this.closed) return\n const safeDurationMs = Number.isFinite(durationMs) && durationMs > 0 ? durationMs : 0\n const durationNs = BigInt(Math.round(safeDurationMs * Number(NS_PER_MS)))\n const node: ProfilerRecordNode = {\n type: 'record',\n label,\n start: this.lastTimestamp,\n durationNs: durationNs >= BIGINT_ZERO ? durationNs : BIGINT_ZERO,\n extra: extra ? { ...extra } : undefined,\n }\n this.appendNode(node)\n this.updateTimestamps(this.lastTimestamp + node.durationNs)\n }\n\n child(label: string, extra?: ProfilerExtra): Profiler {\n if (!this.enabled || this.closed) return disabledProfiler\n const timestamp = now()\n const span: ProfilerSpanNode = {\n type: 'span',\n label,\n start: timestamp,\n durationNs: BIGINT_ZERO,\n extra: extra ? { ...extra } : undefined,\n children: [],\n lastTimestamp: timestamp,\n closed: false,\n }\n this.appendNode(span)\n this.updateTimestamps(timestamp)\n return new ProfilerImpl({ root: this.root, span, parent: this })\n }\n\n end(extra?: ProfilerExtra) {\n if (!this.enabled || this.closed) return\n const current = now()\n if (this.span) {\n this.closeSpan(current, extra)\n } else {\n this.closeRoot(current, extra)\n }\n }\n\n private appendNode(node: ProfilerInternalNode) {\n if (this.span) {\n this.span.children.push(node)\n this.span.lastTimestamp = node.start\n } else {\n this.root.nodes.push(node)\n }\n }\n\n private updateTimestamps(newTimestamp: bigint) {\n if (this.span) {\n this.span.lastTimestamp = newTimestamp\n } else {\n this.root.lastTimestamp = newTimestamp\n }\n this.lastTimestamp = newTimestamp\n }\n\n private closeSpan(closedAt: bigint, extra?: ProfilerExtra) {\n if (!this.span || this.span.closed) return\n const effectiveEnd = closedAt >= this.span.start ? closedAt : this.span.start\n this.span.durationNs = effectiveEnd - this.span.start\n this.span.extra = mergeExtra(this.span.extra, extra)\n this.span.closed = true\n this.closed = true\n this.updateTimestamps(effectiveEnd)\n if (this.parent) {\n this.parent.updateTimestamps(effectiveEnd)\n } else {\n this.root.lastTimestamp = effectiveEnd\n }\n }\n\n private closeRoot(closedAt: bigint, extra?: ProfilerExtra) {\n if (this.root.closed) return\n const endTime = closedAt >= this.root.startedAt ? closedAt : this.root.startedAt\n this.root.lastTimestamp = endTime\n this.root.meta = mergeExtra(this.root.meta, extra)\n this.root.closed = true\n this.closed = true\n const totalNs = endTime - this.root.startedAt\n const snapshot: ProfilerSnapshot = {\n scope: this.root.scope,\n target: this.root.target,\n totalMs: roundDuration(totalNs),\n tree: this.root.nodes.map(serializeNode),\n }\n if (this.root.meta && Object.keys(this.root.meta).length > 0) {\n snapshot.meta = this.root.meta\n }\n try {\n logger.info('Profiler snapshot', { label: this.root.loggerLabel, snapshot })\n } catch {\n // ignore logging failures\n }\n }\n}\n\nconst disabledSection: ProfilerSection = { end: () => {} }\n\nconst disabledProfiler: Profiler = {\n get enabled() {\n return false\n },\n mark: () => {},\n section: () => disabledSection,\n measure: async (_label, fn) => Promise.resolve(fn()),\n record: () => {},\n child: () => disabledProfiler,\n end: () => {},\n}\n\nexport type CreateProfilerOptions = {\n scope: string\n target?: string\n label?: string\n enabled?: boolean\n loggerLabel?: string\n meta?: ProfilerExtra\n}\n\nexport function createProfiler(options: CreateProfilerOptions): Profiler {\n if (options.enabled === false) return disabledProfiler\n const startedAt = now()\n const enabledFlag = options.enabled !== undefined ? options.enabled : true\n const root: ProfilerRootState = {\n scope: options.scope,\n target: options.target,\n label: options.label ?? options.scope,\n loggerLabel: options.loggerLabel ?? '[profile]',\n enabled: enabledFlag,\n startedAt,\n lastTimestamp: startedAt,\n nodes: [],\n closed: false,\n meta: options.meta ? { ...options.meta } : undefined,\n }\n return new ProfilerImpl({ root })\n}\n\nexport function normalizeProfilerTokens(input: string | null | undefined): string[] {\n if (!input) return []\n return input\n .split(',')\n .map((token) => token.trim().toLowerCase())\n .filter((token) => token.length > 0)\n}\n\nexport function profilerMatches(target: string, tokens: string[]): boolean {\n if (!tokens.length) return false\n const lower = target.toLowerCase()\n return tokens.some((token) => {\n if (token === '*' || token === 'all' || parseBooleanToken(token) === true) return true\n if (token.endsWith('*')) {\n const prefix = token.slice(0, -1)\n return prefix.length === 0 ? true : lower.startsWith(prefix)\n }\n return token === lower\n })\n}\n\nconst DEFAULT_ENV_KEYS = [\n 'OM_PROFILE',\n 'NEXT_PUBLIC_OM_PROFILE',\n 'OM_CRUD_PROFILE',\n 'NEXT_PUBLIC_OM_CRUD_PROFILE',\n 'OM_QE_PROFILE',\n 'NEXT_PUBLIC_OM_QE_PROFILE',\n] as const\n\nexport function resolveProfilerTokens(envKeys: readonly string[] = DEFAULT_ENV_KEYS): string[] {\n const tokens: string[] = []\n envKeys.forEach((key) => {\n const raw = process.env[key]\n if (!raw) return\n const parsed = normalizeProfilerTokens(raw)\n if (parsed.length) tokens.push(...parsed)\n })\n return Array.from(new Set(tokens))\n}\n\nexport function shouldEnableProfiler(\n target: string,\n options?: { tokens?: string[]; envKeys?: readonly string[] }\n): boolean {\n const tokens = options?.tokens ?? resolveProfilerTokens(options?.envKeys)\n if (!tokens.length) return false\n return profilerMatches(target, tokens)\n}\n\nexport const disabledProfilerInstance = disabledProfiler\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/lib/query/engine.js
CHANGED
|
@@ -14,6 +14,8 @@ import {
|
|
|
14
14
|
} from "../crud/custom-field-definition-index.js";
|
|
15
15
|
import { resolveEncryptedSortFields, resolveEncryptedSortMaxRows, sortRowsInMemory } from "./encrypted-sort.js";
|
|
16
16
|
import { mapWithConcurrency } from "./bounded-decrypt.js";
|
|
17
|
+
import { createLogger } from "../logger/index.js";
|
|
18
|
+
const logger = createLogger("shared").child({ component: "query" });
|
|
17
19
|
const DECRYPT_CONCURRENCY = 8;
|
|
18
20
|
const entityTableCache = /* @__PURE__ */ new Map();
|
|
19
21
|
const ENTITY_ID_PATTERN = /^[a-z][a-z0-9_]*:[a-z][a-z0-9_]*$/;
|
|
@@ -78,9 +80,7 @@ function resolveEntityTableName(em, entity) {
|
|
|
78
80
|
return registered;
|
|
79
81
|
}
|
|
80
82
|
const fallback = pluralizeBaseName(rawName || "");
|
|
81
|
-
|
|
82
|
-
`[QueryEngine] Could not resolve entity "${entity}" via ORM metadata. Falling back to table name "${fallback}". Ensure the entity ID segment matches the class name convention.`
|
|
83
|
-
);
|
|
83
|
+
logger.warn("Could not resolve entity via ORM metadata; falling back to table name \u2014 ensure the entity ID segment matches the class name convention", { entity, fallback });
|
|
84
84
|
entityTableCache.set(entity, fallback);
|
|
85
85
|
return fallback;
|
|
86
86
|
}
|
|
@@ -709,7 +709,7 @@ class BasicQueryEngine {
|
|
|
709
709
|
);
|
|
710
710
|
return { ...item, ...decrypted };
|
|
711
711
|
} catch (err) {
|
|
712
|
-
|
|
712
|
+
logger.error("Error decrypting entity payload", { err });
|
|
713
713
|
return item;
|
|
714
714
|
}
|
|
715
715
|
};
|
|
@@ -1063,9 +1063,8 @@ class BasicQueryEngine {
|
|
|
1063
1063
|
}
|
|
1064
1064
|
logSearchDebug(event, payload) {
|
|
1065
1065
|
try {
|
|
1066
|
-
|
|
1066
|
+
logger.debug(event, payload);
|
|
1067
1067
|
} catch {
|
|
1068
|
-
console.info("[query:search]", event, payload);
|
|
1069
1068
|
}
|
|
1070
1069
|
}
|
|
1071
1070
|
resolveOrganizationScope(opts) {
|