@rawsql-ts/ztd-cli 0.14.4 → 0.16.0

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 (130) hide show
  1. package/README.md +25 -11
  2. package/dist/commands/init.js +27 -10
  3. package/dist/commands/init.js.map +1 -1
  4. package/dist/commands/lint.d.ts +59 -0
  5. package/dist/commands/lint.js +338 -0
  6. package/dist/commands/lint.js.map +1 -0
  7. package/dist/index.js +2 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/utils/sqlLintHelpers.d.ts +18 -0
  10. package/dist/utils/sqlLintHelpers.js +270 -0
  11. package/dist/utils/sqlLintHelpers.js.map +1 -0
  12. package/package.json +11 -4
  13. package/templates/AGENTS.md +95 -53
  14. package/templates/README.md +45 -67
  15. package/templates/dist/drivers/pg-testkit/src/driver/PgTestkitClient.d.ts +38 -0
  16. package/templates/dist/drivers/pg-testkit/src/driver/PgTestkitClient.js +117 -0
  17. package/templates/dist/drivers/pg-testkit/src/driver/PgTestkitClient.js.map +1 -0
  18. package/templates/dist/drivers/pg-testkit/src/driver/createPgTestkitPool.d.ts +4 -0
  19. package/templates/dist/drivers/pg-testkit/src/driver/createPgTestkitPool.js +71 -0
  20. package/templates/dist/drivers/pg-testkit/src/driver/createPgTestkitPool.js.map +1 -0
  21. package/templates/dist/drivers/pg-testkit/src/index.d.ts +5 -0
  22. package/templates/dist/drivers/pg-testkit/src/index.js +11 -0
  23. package/templates/dist/drivers/pg-testkit/src/index.js.map +1 -0
  24. package/templates/dist/drivers/pg-testkit/src/proxy/wrapPgClient.d.ts +3 -0
  25. package/templates/dist/drivers/pg-testkit/src/proxy/wrapPgClient.js +79 -0
  26. package/templates/dist/drivers/pg-testkit/src/proxy/wrapPgClient.js.map +1 -0
  27. package/templates/dist/drivers/pg-testkit/src/types.d.ts +69 -0
  28. package/templates/dist/drivers/pg-testkit/src/types.js +3 -0
  29. package/templates/dist/drivers/pg-testkit/src/types.js.map +1 -0
  30. package/templates/dist/drivers/pg-testkit/src/utils/fixtureState.d.ts +15 -0
  31. package/templates/dist/drivers/pg-testkit/src/utils/fixtureState.js +34 -0
  32. package/templates/dist/drivers/pg-testkit/src/utils/fixtureState.js.map +1 -0
  33. package/templates/dist/drivers/pg-testkit/src/utils/fixtureValidation.d.ts +12 -0
  34. package/templates/dist/drivers/pg-testkit/src/utils/fixtureValidation.js +53 -0
  35. package/templates/dist/drivers/pg-testkit/src/utils/fixtureValidation.js.map +1 -0
  36. package/templates/dist/mapper-core/src/index.d.ts +160 -0
  37. package/templates/dist/mapper-core/src/index.js +637 -0
  38. package/templates/dist/mapper-core/src/index.js.map +1 -0
  39. package/templates/dist/testkit-core/src/errors/index.d.ts +49 -0
  40. package/templates/dist/testkit-core/src/errors/index.js +111 -0
  41. package/templates/dist/testkit-core/src/errors/index.js.map +1 -0
  42. package/templates/dist/testkit-core/src/fixtures/ColumnAffinity.d.ts +5 -0
  43. package/templates/dist/testkit-core/src/fixtures/ColumnAffinity.js +29 -0
  44. package/templates/dist/testkit-core/src/fixtures/ColumnAffinity.js.map +1 -0
  45. package/templates/dist/testkit-core/src/fixtures/DdlFixtureLoader.d.ts +37 -0
  46. package/templates/dist/testkit-core/src/fixtures/DdlFixtureLoader.js +182 -0
  47. package/templates/dist/testkit-core/src/fixtures/DdlFixtureLoader.js.map +1 -0
  48. package/templates/dist/testkit-core/src/fixtures/FixtureProvider.d.ts +20 -0
  49. package/templates/dist/testkit-core/src/fixtures/FixtureProvider.js +121 -0
  50. package/templates/dist/testkit-core/src/fixtures/FixtureProvider.js.map +1 -0
  51. package/templates/dist/testkit-core/src/fixtures/FixtureStore.d.ts +51 -0
  52. package/templates/dist/testkit-core/src/fixtures/FixtureStore.js +199 -0
  53. package/templates/dist/testkit-core/src/fixtures/FixtureStore.js.map +1 -0
  54. package/templates/dist/testkit-core/src/fixtures/TableDefinitionSchemaRegistry.d.ts +10 -0
  55. package/templates/dist/testkit-core/src/fixtures/TableDefinitionSchemaRegistry.js +28 -0
  56. package/templates/dist/testkit-core/src/fixtures/TableDefinitionSchemaRegistry.js.map +1 -0
  57. package/templates/dist/testkit-core/src/fixtures/TableNameResolver.d.ts +18 -0
  58. package/templates/dist/testkit-core/src/fixtures/TableNameResolver.js +80 -0
  59. package/templates/dist/testkit-core/src/fixtures/TableNameResolver.js.map +1 -0
  60. package/templates/dist/testkit-core/src/fixtures/ddlLint.d.ts +59 -0
  61. package/templates/dist/testkit-core/src/fixtures/ddlLint.js +489 -0
  62. package/templates/dist/testkit-core/src/fixtures/ddlLint.js.map +1 -0
  63. package/templates/dist/testkit-core/src/fixtures/naming.d.ts +1 -0
  64. package/templates/dist/testkit-core/src/fixtures/naming.js +6 -0
  65. package/templates/dist/testkit-core/src/fixtures/naming.js.map +1 -0
  66. package/templates/dist/testkit-core/src/index.d.ts +17 -0
  67. package/templates/dist/testkit-core/src/index.js +47 -0
  68. package/templates/dist/testkit-core/src/index.js.map +1 -0
  69. package/templates/dist/testkit-core/src/logger/NoopLogger.d.ts +8 -0
  70. package/templates/dist/testkit-core/src/logger/NoopLogger.js +16 -0
  71. package/templates/dist/testkit-core/src/logger/NoopLogger.js.map +1 -0
  72. package/templates/dist/testkit-core/src/provider/TestkitProvider.d.ts +57 -0
  73. package/templates/dist/testkit-core/src/provider/TestkitProvider.js +149 -0
  74. package/templates/dist/testkit-core/src/provider/TestkitProvider.js.map +1 -0
  75. package/templates/dist/testkit-core/src/rewriter/ResultSelectRewriter.d.ts +43 -0
  76. package/templates/dist/testkit-core/src/rewriter/ResultSelectRewriter.js +473 -0
  77. package/templates/dist/testkit-core/src/rewriter/ResultSelectRewriter.js.map +1 -0
  78. package/templates/dist/testkit-core/src/rewriter/SelectAnalyzer.d.ts +9 -0
  79. package/templates/dist/testkit-core/src/rewriter/SelectAnalyzer.js +38 -0
  80. package/templates/dist/testkit-core/src/rewriter/SelectAnalyzer.js.map +1 -0
  81. package/templates/dist/testkit-core/src/rewriter/SelectFixtureRewriter.d.ts +42 -0
  82. package/templates/dist/testkit-core/src/rewriter/SelectFixtureRewriter.js +298 -0
  83. package/templates/dist/testkit-core/src/rewriter/SelectFixtureRewriter.js.map +1 -0
  84. package/templates/dist/testkit-core/src/sql/SqliteValuesBuilder.d.ts +12 -0
  85. package/templates/dist/testkit-core/src/sql/SqliteValuesBuilder.js +63 -0
  86. package/templates/dist/testkit-core/src/sql/SqliteValuesBuilder.js.map +1 -0
  87. package/templates/dist/testkit-core/src/types/index.d.ts +69 -0
  88. package/templates/dist/testkit-core/src/types/index.js +3 -0
  89. package/templates/dist/testkit-core/src/types/index.js.map +1 -0
  90. package/templates/dist/testkit-core/src/utils/queryHelpers.d.ts +28 -0
  91. package/templates/dist/testkit-core/src/utils/queryHelpers.js +81 -0
  92. package/templates/dist/testkit-core/src/utils/queryHelpers.js.map +1 -0
  93. package/templates/dist/writer-core/src/index.d.ts +34 -0
  94. package/templates/dist/writer-core/src/index.js +115 -0
  95. package/templates/dist/writer-core/src/index.js.map +1 -0
  96. package/templates/dist/ztd-cli/templates/src/db/sql-client.d.ts +20 -0
  97. package/templates/dist/ztd-cli/templates/src/db/sql-client.js +3 -0
  98. package/templates/dist/ztd-cli/templates/src/db/sql-client.js.map +1 -0
  99. package/templates/dist/ztd-cli/templates/src/repositories/user-accounts.d.ts +36 -0
  100. package/templates/dist/ztd-cli/templates/src/repositories/user-accounts.js +85 -0
  101. package/templates/dist/ztd-cli/templates/src/repositories/user-accounts.js.map +1 -0
  102. package/templates/dist/ztd-cli/templates/tests/generated/ztd-row-map.generated.d.ts +20 -0
  103. package/templates/dist/ztd-cli/templates/tests/generated/ztd-row-map.generated.js +33 -0
  104. package/templates/dist/ztd-cli/templates/tests/generated/ztd-row-map.generated.js.map +1 -0
  105. package/templates/dist/ztd-cli/templates/tests/support/global-setup.d.ts +10 -0
  106. package/templates/dist/ztd-cli/templates/tests/support/global-setup.js +29 -0
  107. package/templates/dist/ztd-cli/templates/tests/support/global-setup.js.map +1 -0
  108. package/templates/dist/ztd-cli/templates/tests/support/testkit-client.d.ts +66 -0
  109. package/templates/dist/ztd-cli/templates/tests/support/testkit-client.js +552 -0
  110. package/templates/dist/ztd-cli/templates/tests/support/testkit-client.js.map +1 -0
  111. package/templates/dist/ztd-cli/templates/tests/user-profiles.test.d.ts +1 -0
  112. package/templates/dist/ztd-cli/templates/tests/user-profiles.test.js +82 -0
  113. package/templates/dist/ztd-cli/templates/tests/user-profiles.test.js.map +1 -0
  114. package/templates/dist/ztd-cli/templates/tests/writer-constraints.test.d.ts +1 -0
  115. package/templates/dist/ztd-cli/templates/tests/writer-constraints.test.js +29 -0
  116. package/templates/dist/ztd-cli/templates/tests/writer-constraints.test.js.map +1 -0
  117. package/templates/dist/ztd-cli/templates/tests/ztd-layout.generated.d.ts +7 -0
  118. package/templates/dist/ztd-cli/templates/tests/ztd-layout.generated.js +10 -0
  119. package/templates/dist/ztd-cli/templates/tests/ztd-layout.generated.js.map +1 -0
  120. package/templates/src/db/sql-client.ts +1 -1
  121. package/templates/src/repositories/user-accounts.ts +179 -0
  122. package/templates/tests/AGENTS.md +59 -6
  123. package/templates/tests/support/global-setup.ts +1 -1
  124. package/templates/tests/support/testkit-client.ts +4 -4
  125. package/templates/tests/user-profiles.test.ts +161 -0
  126. package/templates/tests/writer-constraints.test.ts +32 -0
  127. package/templates/tests/ztd-layout.generated.ts +0 -2
  128. package/templates/tsconfig.json +1 -2
  129. package/templates/ztd/AGENTS.md +10 -85
  130. package/templates/ztd/README.md +10 -79
@@ -0,0 +1,552 @@
1
+ "use strict";
2
+ // ZTD testkit helper - AUTO GENERATED
3
+ // ztd-cli emits this file during project bootstrapping to wire pg-testkit.
4
+ // Regenerate via npx ztd init (choose overwrite when prompted); avoid manual edits.
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.createTestkitClient = createTestkitClient;
10
+ const node_fs_1 = require("node:fs");
11
+ const node_path_1 = __importDefault(require("node:path"));
12
+ const pg_1 = require("pg");
13
+ const pg_testkit_1 = require("@rawsql-ts/pg-testkit");
14
+ const ddlDirectories = [node_path_1.default.resolve(__dirname, '../../ztd/ddl')];
15
+ let sharedPgClient;
16
+ let sharedQueryable;
17
+ const { INT2, INT4, INT8, NUMERIC, DATE } = pg_1.types.builtins;
18
+ const parseInteger = (value) => (value === null ? null : Number(value));
19
+ const parseNumeric = (value) => (value === null ? null : Number(value));
20
+ // Align pg parsers with the primitive shapes the fixtures assert in tests.
21
+ pg_1.types.setTypeParser(INT2, parseInteger);
22
+ pg_1.types.setTypeParser(INT4, parseInteger);
23
+ pg_1.types.setTypeParser(INT8, parseInteger);
24
+ pg_1.types.setTypeParser(NUMERIC, parseNumeric);
25
+ pg_1.types.setTypeParser(DATE, (value) => value);
26
+ function isTruthyEnv(value) {
27
+ if (!value) {
28
+ return false;
29
+ }
30
+ return value === '1' || value.toLowerCase() === 'true' || value.toLowerCase() === 'yes';
31
+ }
32
+ function resolveNumberEnv(value) {
33
+ if (!value) {
34
+ return undefined;
35
+ }
36
+ const parsed = Number(value);
37
+ return Number.isFinite(parsed) ? parsed : undefined;
38
+ }
39
+ function safeJsonStringify(value) {
40
+ const seen = new WeakSet();
41
+ return JSON.stringify(value, (_key, item) => {
42
+ // Avoid JSON.stringify throwing on BigInt params when logging is enabled.
43
+ if (typeof item === 'bigint') {
44
+ return item.toString();
45
+ }
46
+ // Avoid JSON.stringify throwing on circular references when logging is enabled.
47
+ if (typeof item === 'object' && item !== null) {
48
+ if (seen.has(item)) {
49
+ return '[Circular]';
50
+ }
51
+ seen.add(item);
52
+ }
53
+ return item;
54
+ });
55
+ }
56
+ async function resolveDatabaseUrl() {
57
+ const configuredUrl = process.env.DATABASE_URL;
58
+ if (configuredUrl) {
59
+ return configuredUrl;
60
+ }
61
+ throw new Error('DATABASE_URL is required. It should be provided by Vitest globalSetup or your environment.');
62
+ }
63
+ async function getPgClient() {
64
+ if (sharedPgClient) {
65
+ return sharedPgClient;
66
+ }
67
+ const databaseUrl = await resolveDatabaseUrl();
68
+ const clientConfig = { connectionString: databaseUrl };
69
+ sharedPgClient = new pg_1.Client(clientConfig);
70
+ // Keep the shared Client connected for the duration of the test run.
71
+ await sharedPgClient.connect();
72
+ sharedPgClient.once('end', () => {
73
+ sharedPgClient = undefined;
74
+ sharedQueryable = undefined;
75
+ });
76
+ process.once('exit', () => {
77
+ if (!sharedPgClient) {
78
+ return;
79
+ }
80
+ // Ensure node exits cleanly by closing the connection if tests end early.
81
+ void sharedPgClient.end();
82
+ });
83
+ return sharedPgClient;
84
+ }
85
+ async function getPgQueryable() {
86
+ if (sharedQueryable) {
87
+ return sharedQueryable;
88
+ }
89
+ const client = await getPgClient();
90
+ // Wrap the pg.Client to expose only the subset needed by pg-testkit.
91
+ const wrappedQueryable = {
92
+ query: (textOrConfig, values) => client.query(textOrConfig, values),
93
+ release: () => {
94
+ // Release is intentionally a no-op because the shared client should stay open.
95
+ return;
96
+ }
97
+ };
98
+ sharedQueryable = wrappedQueryable;
99
+ return wrappedQueryable;
100
+ }
101
+ async function createTestkitClient(fixtures, options = {}) {
102
+ const mode = resolveExecutionMode(options.mode);
103
+ if (mode === 'traditional') {
104
+ return createTraditionalPlaygroundClient(fixtures, options);
105
+ }
106
+ return createZtdPlaygroundClient(fixtures, options);
107
+ }
108
+ async function createZtdPlaygroundClient(fixtures, options) {
109
+ const { logEnabled, logParams, logSink, profileEnabled, profilePerQuery, profileParams, profileIncludeSql, profileSampleLimit, profileTestName, profileExecutionMode, profileWorkerId, profileSink, } = buildLoggingState(options);
110
+ let nextQueryId = 1;
111
+ const queryIdStack = [];
112
+ // Keep fixture info aligned with the active query so profiling includes applied fixtures.
113
+ const queryFixtureMap = new Map();
114
+ // Track aggregate timings so teardown logs can summarize the run.
115
+ const profileStats = {
116
+ queryCount: 0,
117
+ totalQueryMs: 0,
118
+ sampleSql: [],
119
+ };
120
+ // Capture a consistent timestamp baseline for the setup phase.
121
+ const setupStartedAt = profileEnabled ? Date.now() : 0;
122
+ const hadSharedConnection = Boolean(sharedPgClient);
123
+ const connectionStartedAt = profileEnabled ? Date.now() : 0;
124
+ const queryable = await getPgQueryable();
125
+ if (profileEnabled) {
126
+ profileSink({
127
+ kind: 'ztd-profile',
128
+ phase: 'connection',
129
+ testName: profileTestName,
130
+ workerId: profileWorkerId,
131
+ processId: process.pid,
132
+ executionMode: profileExecutionMode,
133
+ connectionReused: hadSharedConnection,
134
+ durationMs: Date.now() - connectionStartedAt,
135
+ timestamp: new Date().toISOString(),
136
+ });
137
+ }
138
+ // TableNameResolver keeps DDL and fixtures aligned on canonical schema-qualified identifiers like 'public.table_name'.
139
+ const driver = (0, pg_testkit_1.createPgTestkitClient)({
140
+ connectionFactory: () => queryable,
141
+ tableRows: fixtures,
142
+ ddl: { directories: ddlDirectories },
143
+ onExecute: (rewrittenSql, params, fixturesApplied) => {
144
+ var _a;
145
+ if (profileEnabled) {
146
+ // Capture fixture metadata while the original query is still on the stack.
147
+ const activeQueryId = queryIdStack.at(-1);
148
+ if (typeof activeQueryId === 'number') {
149
+ queryFixtureMap.set(activeQueryId, fixturesApplied);
150
+ }
151
+ }
152
+ if (!logEnabled) {
153
+ return;
154
+ }
155
+ // Use a stack so concurrent async queries can still correlate "original" and "rewritten" logs.
156
+ const queryId = (_a = queryIdStack.at(-1)) !== null && _a !== void 0 ? _a : -1;
157
+ logSink({
158
+ kind: 'ztd-sql',
159
+ phase: 'rewritten',
160
+ queryId,
161
+ sql: rewrittenSql,
162
+ params: logParams ? params : undefined,
163
+ fixturesApplied,
164
+ timestamp: new Date().toISOString(),
165
+ });
166
+ },
167
+ });
168
+ if (profileEnabled) {
169
+ profileSink({
170
+ kind: 'ztd-profile',
171
+ phase: 'setup',
172
+ testName: profileTestName,
173
+ workerId: profileWorkerId,
174
+ processId: process.pid,
175
+ executionMode: profileExecutionMode,
176
+ durationMs: Date.now() - setupStartedAt,
177
+ timestamp: new Date().toISOString(),
178
+ });
179
+ }
180
+ // Expose a simplified query API so tests can assert on plain row arrays.
181
+ return {
182
+ async query(text, values) {
183
+ const queryId = nextQueryId++;
184
+ if (logEnabled) {
185
+ logSink({
186
+ kind: 'ztd-sql',
187
+ phase: 'original',
188
+ queryId,
189
+ sql: text,
190
+ params: logParams ? values : undefined,
191
+ timestamp: new Date().toISOString(),
192
+ });
193
+ }
194
+ const queryStartedAt = profileEnabled ? Date.now() : 0;
195
+ queryIdStack.push(queryId);
196
+ try {
197
+ const result = await driver.query(text, values);
198
+ return result.rows;
199
+ }
200
+ finally {
201
+ queryIdStack.pop();
202
+ if (profileEnabled) {
203
+ // Record per-query timing and keep a small SQL sample for teardown summaries.
204
+ const durationMs = Date.now() - queryStartedAt;
205
+ profileStats.queryCount += 1;
206
+ profileStats.totalQueryMs += durationMs;
207
+ if (profileIncludeSql && profileSampleLimit > 0 && profileStats.sampleSql.length < profileSampleLimit) {
208
+ profileStats.sampleSql.push(text);
209
+ }
210
+ const fixturesApplied = queryFixtureMap.get(queryId);
211
+ queryFixtureMap.delete(queryId);
212
+ if (profilePerQuery) {
213
+ profileSink({
214
+ kind: 'ztd-profile',
215
+ phase: 'query',
216
+ testName: profileTestName,
217
+ workerId: profileWorkerId,
218
+ processId: process.pid,
219
+ executionMode: profileExecutionMode,
220
+ queryId,
221
+ durationMs,
222
+ sql: profileIncludeSql ? text : undefined,
223
+ params: profileParams ? values : undefined,
224
+ fixturesApplied,
225
+ timestamp: new Date().toISOString(),
226
+ });
227
+ }
228
+ }
229
+ }
230
+ },
231
+ async close() {
232
+ const teardownStartedAt = profileEnabled ? Date.now() : 0;
233
+ try {
234
+ await driver.close();
235
+ }
236
+ finally {
237
+ if (profileEnabled) {
238
+ // Always emit the teardown summary, even if close fails mid-flight.
239
+ profileSink({
240
+ kind: 'ztd-profile',
241
+ phase: 'teardown',
242
+ testName: profileTestName,
243
+ workerId: profileWorkerId,
244
+ processId: process.pid,
245
+ executionMode: profileExecutionMode,
246
+ durationMs: Date.now() - teardownStartedAt,
247
+ queryCount: profileStats.queryCount,
248
+ totalQueryMs: profileStats.totalQueryMs,
249
+ sampleSql: profileIncludeSql ? profileStats.sampleSql : undefined,
250
+ timestamp: new Date().toISOString(),
251
+ });
252
+ }
253
+ }
254
+ }
255
+ };
256
+ }
257
+ async function createTraditionalPlaygroundClient(fixtures, options) {
258
+ var _a, _b, _c, _d, _e;
259
+ const { logEnabled, logParams, logSink, profileEnabled, profilePerQuery, profileParams, profileIncludeSql, profileSampleLimit, profileTestName, profileExecutionMode, profileWorkerId, profileSink, } = buildLoggingState(options);
260
+ const databaseUrl = await resolveDatabaseUrl();
261
+ const clientConfig = { connectionString: databaseUrl };
262
+ const client = new pg_1.Client(clientConfig);
263
+ await client.connect();
264
+ const traditional = options.traditional;
265
+ const isolation = (_a = traditional === null || traditional === void 0 ? void 0 : traditional.isolation) !== null && _a !== void 0 ? _a : 'schema';
266
+ const schemaName = isolation === 'schema' ? (_b = traditional === null || traditional === void 0 ? void 0 : traditional.schemaName) !== null && _b !== void 0 ? _b : generateSchemaName() : undefined;
267
+ const setupSql = (_c = traditional === null || traditional === void 0 ? void 0 : traditional.setupSql) !== null && _c !== void 0 ? _c : [];
268
+ const cleanupSql = (_d = traditional === null || traditional === void 0 ? void 0 : traditional.cleanupSql) !== null && _d !== void 0 ? _d : [];
269
+ const cleanupStrategy = (_e = traditional === null || traditional === void 0 ? void 0 : traditional.cleanup) !== null && _e !== void 0 ? _e : (schemaName ? 'drop_schema' : 'none');
270
+ let initializationPromise = null;
271
+ const setupStartedAt = profileEnabled ? Date.now() : 0;
272
+ let setupLogged = false;
273
+ const ensureInitialized = () => {
274
+ if (!initializationPromise) {
275
+ initializationPromise = (async () => {
276
+ if (schemaName) {
277
+ await client.query(`CREATE SCHEMA IF NOT EXISTS ${quoteIdentifier(schemaName)}`);
278
+ await client.query(`SET search_path TO ${quoteIdentifier(schemaName)}, public`);
279
+ }
280
+ // Build the schema objects before seeding or running custom setup SQL.
281
+ await applySqlFiles(client, ddlDirectories);
282
+ // Allow callers to run additional setup steps before the fixtures load.
283
+ for (const sql of setupSql) {
284
+ if (!sql.trim()) {
285
+ continue;
286
+ }
287
+ await client.query(sql);
288
+ }
289
+ // Materialize the fixture rows into the isolated schema.
290
+ await seedFixtureRows(client, fixtures, schemaName);
291
+ })().then(() => {
292
+ if (profileEnabled && !setupLogged) {
293
+ profileSink({
294
+ kind: 'ztd-profile',
295
+ phase: 'setup',
296
+ testName: profileTestName,
297
+ workerId: profileWorkerId,
298
+ processId: process.pid,
299
+ executionMode: profileExecutionMode,
300
+ durationMs: Date.now() - setupStartedAt,
301
+ timestamp: new Date().toISOString(),
302
+ });
303
+ setupLogged = true;
304
+ }
305
+ });
306
+ }
307
+ return initializationPromise;
308
+ };
309
+ let cleanupRun = false;
310
+ const runCleanup = async () => {
311
+ if (cleanupRun) {
312
+ return;
313
+ }
314
+ cleanupRun = true;
315
+ // Execute any caller-supplied cleanup statements before further teardown.
316
+ if (cleanupStrategy === 'custom_sql') {
317
+ for (const sql of cleanupSql) {
318
+ if (!sql.trim()) {
319
+ continue;
320
+ }
321
+ await client.query(sql);
322
+ }
323
+ }
324
+ // Tear down the isolated schema when requested.
325
+ if (cleanupStrategy === 'drop_schema' && schemaName) {
326
+ await client.query(`DROP SCHEMA IF EXISTS ${quoteIdentifier(schemaName)} CASCADE`);
327
+ }
328
+ };
329
+ const connectionStartedAt = profileEnabled ? Date.now() : 0;
330
+ if (profileEnabled) {
331
+ profileSink({
332
+ kind: 'ztd-profile',
333
+ phase: 'connection',
334
+ testName: profileTestName,
335
+ workerId: profileWorkerId,
336
+ processId: process.pid,
337
+ executionMode: profileExecutionMode,
338
+ connectionReused: false,
339
+ durationMs: Date.now() - connectionStartedAt,
340
+ timestamp: new Date().toISOString(),
341
+ });
342
+ }
343
+ let nextQueryId = 1;
344
+ const queryIdStack = [];
345
+ const profileStats = {
346
+ queryCount: 0,
347
+ totalQueryMs: 0,
348
+ sampleSql: [],
349
+ };
350
+ return {
351
+ async query(text, values) {
352
+ const queryId = nextQueryId++;
353
+ // Emit the original SQL so the tracing/logging pipeline stays consistent.
354
+ if (logEnabled) {
355
+ logSink({
356
+ kind: 'ztd-sql',
357
+ phase: 'original',
358
+ queryId,
359
+ sql: text,
360
+ params: logParams ? values : undefined,
361
+ timestamp: new Date().toISOString(),
362
+ });
363
+ }
364
+ const queryStartedAt = profileEnabled ? Date.now() : 0;
365
+ queryIdStack.push(queryId);
366
+ try {
367
+ await ensureInitialized();
368
+ const result = await client.query(text, values);
369
+ return result.rows;
370
+ }
371
+ finally {
372
+ queryIdStack.pop();
373
+ if (profileEnabled) {
374
+ const durationMs = Date.now() - queryStartedAt;
375
+ profileStats.queryCount += 1;
376
+ profileStats.totalQueryMs += durationMs;
377
+ if (profileIncludeSql && profileSampleLimit > 0 && profileStats.sampleSql.length < profileSampleLimit) {
378
+ profileStats.sampleSql.push(text);
379
+ }
380
+ if (profilePerQuery) {
381
+ profileSink({
382
+ kind: 'ztd-profile',
383
+ phase: 'query',
384
+ testName: profileTestName,
385
+ workerId: profileWorkerId,
386
+ processId: process.pid,
387
+ executionMode: profileExecutionMode,
388
+ queryId,
389
+ durationMs,
390
+ sql: profileIncludeSql ? text : undefined,
391
+ params: profileParams ? values : undefined,
392
+ timestamp: new Date().toISOString(),
393
+ });
394
+ }
395
+ }
396
+ }
397
+ },
398
+ async close() {
399
+ const teardownStartedAt = profileEnabled ? Date.now() : 0;
400
+ // Preserve the first teardown error so we can rethrow it after ensuring the client closes.
401
+ let teardownError;
402
+ try {
403
+ if (initializationPromise) {
404
+ await initializationPromise.catch(() => undefined);
405
+ }
406
+ await runCleanup();
407
+ }
408
+ catch (error) {
409
+ teardownError = error;
410
+ }
411
+ finally {
412
+ if (profileEnabled) {
413
+ profileSink({
414
+ kind: 'ztd-profile',
415
+ phase: 'teardown',
416
+ testName: profileTestName,
417
+ workerId: profileWorkerId,
418
+ processId: process.pid,
419
+ executionMode: profileExecutionMode,
420
+ durationMs: Date.now() - teardownStartedAt,
421
+ queryCount: profileStats.queryCount,
422
+ totalQueryMs: profileStats.totalQueryMs,
423
+ sampleSql: profileIncludeSql ? profileStats.sampleSql : undefined,
424
+ timestamp: new Date().toISOString(),
425
+ });
426
+ }
427
+ // Always attempt to close the client and record any failure without overriding earlier errors.
428
+ try {
429
+ await client.end();
430
+ }
431
+ catch (clientError) {
432
+ if (!teardownError) {
433
+ teardownError = clientError;
434
+ }
435
+ }
436
+ }
437
+ if (teardownError) {
438
+ throw teardownError;
439
+ }
440
+ },
441
+ };
442
+ }
443
+ function buildLoggingState(options) {
444
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
445
+ const logEnabled = (_a = options.enabled) !== null && _a !== void 0 ? _a : isTruthyEnv(process.env.ZTD_SQL_LOG);
446
+ const logParams = (_b = options.includeParams) !== null && _b !== void 0 ? _b : isTruthyEnv(process.env.ZTD_SQL_LOG_PARAMS);
447
+ const logSink = (_c = options.logger) !== null && _c !== void 0 ? _c : ((event) => {
448
+ console.log(safeJsonStringify(event));
449
+ });
450
+ const profileOptions = (_d = options.profile) !== null && _d !== void 0 ? _d : {};
451
+ const profileEnabled = (_e = profileOptions.enabled) !== null && _e !== void 0 ? _e : isTruthyEnv(process.env.ZTD_PROFILE);
452
+ const profilePerQuery = (_f = profileOptions.perQuery) !== null && _f !== void 0 ? _f : isTruthyEnv(process.env.ZTD_PROFILE_PER_QUERY);
453
+ const profileParams = (_g = profileOptions.includeParams) !== null && _g !== void 0 ? _g : isTruthyEnv(process.env.ZTD_PROFILE_PARAMS);
454
+ const profileIncludeSql = (_h = profileOptions.includeSql) !== null && _h !== void 0 ? _h : isTruthyEnv(process.env.ZTD_PROFILE_SQL);
455
+ const profileSampleLimit = (_k = (_j = profileOptions.sampleLimit) !== null && _j !== void 0 ? _j : resolveNumberEnv(process.env.ZTD_PROFILE_SAMPLE_LIMIT)) !== null && _k !== void 0 ? _k : 5;
456
+ const profileTestName = (_l = profileOptions.testName) !== null && _l !== void 0 ? _l : process.env.ZTD_PROFILE_TEST_NAME;
457
+ const profileExecutionMode = (_o = (_m = profileOptions.executionMode) !== null && _m !== void 0 ? _m : process.env.ZTD_PROFILE_EXECUTION) !== null && _o !== void 0 ? _o : (process.env.VITEST_WORKER_ID ? 'parallel' : 'serial');
458
+ const profileWorkerId = (_p = process.env.VITEST_WORKER_ID) !== null && _p !== void 0 ? _p : process.env.JEST_WORKER_ID;
459
+ const profileSink = (_q = profileOptions.logger) !== null && _q !== void 0 ? _q : ((event) => {
460
+ console.log(safeJsonStringify(event));
461
+ });
462
+ return {
463
+ logEnabled,
464
+ logParams,
465
+ logSink,
466
+ profileEnabled,
467
+ profilePerQuery,
468
+ profileParams,
469
+ profileIncludeSql,
470
+ profileSampleLimit,
471
+ profileTestName,
472
+ profileExecutionMode,
473
+ profileWorkerId,
474
+ profileSink,
475
+ };
476
+ }
477
+ function resolveExecutionMode(mode) {
478
+ if (mode === 'traditional') {
479
+ return 'traditional';
480
+ }
481
+ const envMode = process.env.ZTD_EXECUTION_MODE;
482
+ return envMode === 'traditional' ? 'traditional' : 'ztd';
483
+ }
484
+ function generateSchemaName() {
485
+ const timestamp = Date.now().toString(36);
486
+ const random = Math.random().toString(36).slice(2, 7);
487
+ return `ztd_traditional_${timestamp}_${random}`;
488
+ }
489
+ async function applySqlFiles(client, directories) {
490
+ // Execute each .sql file so the physical schema matches the ZTD definitions.
491
+ for (const directory of directories) {
492
+ if (!(0, node_fs_1.existsSync)(directory)) {
493
+ continue;
494
+ }
495
+ const entries = await node_fs_1.promises.readdir(directory, { withFileTypes: true });
496
+ for (const entry of entries) {
497
+ if (!entry.isFile() || !entry.name.toLowerCase().endsWith('.sql')) {
498
+ continue;
499
+ }
500
+ const filePath = node_path_1.default.join(directory, entry.name);
501
+ const sql = await node_fs_1.promises.readFile(filePath, 'utf8');
502
+ if (!sql.trim()) {
503
+ continue;
504
+ }
505
+ await client.query(sql);
506
+ }
507
+ }
508
+ }
509
+ async function seedFixtureRows(client, fixtures, isolationSchema) {
510
+ for (const fixture of fixtures) {
511
+ if (fixture.rows.length === 0) {
512
+ continue;
513
+ }
514
+ const columnNames = getColumnNamesFromFixture(fixture);
515
+ if (columnNames.length === 0) {
516
+ continue;
517
+ }
518
+ const tableIdentifier = buildTableIdentifier(fixture.tableName, isolationSchema);
519
+ const columnsSql = columnNames.map(quoteIdentifier).join(', ');
520
+ for (const row of fixture.rows) {
521
+ const values = columnNames.map((column) => Object.prototype.hasOwnProperty.call(row, column) ? row[column] : null);
522
+ const placeholders = values.map((_, index) => `$${index + 1}`).join(', ');
523
+ await client.query(`INSERT INTO ${tableIdentifier} (${columnsSql}) VALUES (${placeholders})`, values);
524
+ }
525
+ }
526
+ }
527
+ function getColumnNamesFromFixture(fixture) {
528
+ if (fixture.schema && Array.isArray(fixture.schema.columns)) {
529
+ return fixture.schema.columns.map((column) => column.name);
530
+ }
531
+ if (fixture.schema && 'columns' in fixture.schema && typeof fixture.schema.columns === 'object') {
532
+ return Object.keys(fixture.schema.columns);
533
+ }
534
+ if (fixture.rows.length > 0) {
535
+ return Object.keys(fixture.rows[0]);
536
+ }
537
+ return [];
538
+ }
539
+ function buildTableIdentifier(tableName, isolationSchema) {
540
+ const segments = tableName.split('.');
541
+ const baseTable = segments.length > 1 ? segments[segments.length - 1] : tableName;
542
+ const schema = isolationSchema !== null && isolationSchema !== void 0 ? isolationSchema : (segments.length > 1 ? segments.slice(0, -1).join('.') : undefined);
543
+ if (schema) {
544
+ return `${quoteIdentifier(schema)}.${quoteIdentifier(baseTable)}`;
545
+ }
546
+ return quoteIdentifier(baseTable);
547
+ }
548
+ function quoteIdentifier(value) {
549
+ const escaped = value.replace(/"/g, '""');
550
+ return `"${escaped}"`;
551
+ }
552
+ //# sourceMappingURL=testkit-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testkit-client.js","sourceRoot":"","sources":["../../../../../tests/support/testkit-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const ztd_row_map_generated_1 = require("./generated/ztd-row-map.generated");
5
+ const testkit_client_1 = require("./support/testkit-client");
6
+ const user_accounts_1 = require("../src/repositories/user-accounts");
7
+ function buildUserAccounts() {
8
+ return [
9
+ {
10
+ user_account_id: 1,
11
+ username: 'alpha',
12
+ email: 'alpha@example.com',
13
+ display_name: 'Alpha Tester',
14
+ created_at: '2025-12-01T08:00:00Z',
15
+ updated_at: '2025-12-01T09:00:00Z',
16
+ },
17
+ {
18
+ user_account_id: 2,
19
+ username: 'bravo',
20
+ email: 'bravo@example.com',
21
+ display_name: 'Bravo Builder',
22
+ created_at: '2025-12-02T10:00:00Z',
23
+ updated_at: '2025-12-02T11:00:00Z',
24
+ },
25
+ ];
26
+ }
27
+ function buildUserProfiles() {
28
+ return [
29
+ {
30
+ profile_id: 101,
31
+ user_account_id: 1,
32
+ bio: 'Lead engineer and mapper advocate.',
33
+ website: 'https://example.com',
34
+ verified: true,
35
+ },
36
+ ];
37
+ }
38
+ function buildFixtures() {
39
+ return [
40
+ (0, ztd_row_map_generated_1.tableFixture)('public.user_account', buildUserAccounts(), ztd_row_map_generated_1.tableSchemas['public.user_account']),
41
+ (0, ztd_row_map_generated_1.tableFixture)('public.user_profile', buildUserProfiles(), ztd_row_map_generated_1.tableSchemas['public.user_profile']),
42
+ ];
43
+ }
44
+ (0, vitest_1.describe)('user profile mapper', () => {
45
+ (0, vitest_1.test)('hydrate optional profiles with mapper-core', async () => {
46
+ const fixtures = buildFixtures();
47
+ const client = await (0, testkit_client_1.createTestkitClient)(fixtures);
48
+ try {
49
+ const result = await (0, user_accounts_1.listUserProfiles)(client);
50
+ (0, vitest_1.expect)(result).toEqual([
51
+ {
52
+ userAccountId: 1,
53
+ username: 'alpha',
54
+ email: 'alpha@example.com',
55
+ displayName: 'Alpha Tester',
56
+ createdAt: new Date('2025-12-01T08:00:00Z'),
57
+ updatedAt: new Date('2025-12-01T09:00:00Z'),
58
+ profile: {
59
+ profileId: 101,
60
+ userAccountId: 1,
61
+ bio: 'Lead engineer and mapper advocate.',
62
+ website: 'https://example.com',
63
+ verified: true,
64
+ },
65
+ },
66
+ {
67
+ userAccountId: 2,
68
+ username: 'bravo',
69
+ email: 'bravo@example.com',
70
+ displayName: 'Bravo Builder',
71
+ createdAt: new Date('2025-12-02T10:00:00Z'),
72
+ updatedAt: new Date('2025-12-02T11:00:00Z'),
73
+ profile: undefined,
74
+ },
75
+ ]);
76
+ }
77
+ finally {
78
+ await client.close();
79
+ }
80
+ });
81
+ });
82
+ //# sourceMappingURL=user-profiles.test.js.map