@rawsql-ts/ztd-cli 0.15.0 → 0.17.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 (153) hide show
  1. package/README.md +38 -25
  2. package/dist/commands/init.d.ts +13 -0
  3. package/dist/commands/init.js +372 -118
  4. package/dist/commands/init.js.map +1 -1
  5. package/dist/commands/lint.d.ts +4 -4
  6. package/dist/commands/lint.js +60 -40
  7. package/dist/commands/lint.js.map +1 -1
  8. package/dist/commands/ztdConfig.d.ts +2 -2
  9. package/dist/commands/ztdConfig.js +26 -12
  10. package/dist/commands/ztdConfig.js.map +1 -1
  11. package/dist/utils/optionalDependencies.d.ts +35 -0
  12. package/dist/utils/optionalDependencies.js +96 -0
  13. package/dist/utils/optionalDependencies.js.map +1 -0
  14. package/package.json +18 -10
  15. package/templates/AGENTS.md +36 -296
  16. package/templates/README.md +12 -237
  17. package/templates/dist/drivers/pg-testkit/src/driver/PgTestkitClient.d.ts +38 -0
  18. package/templates/dist/drivers/pg-testkit/src/driver/PgTestkitClient.js +117 -0
  19. package/templates/dist/drivers/pg-testkit/src/driver/PgTestkitClient.js.map +1 -0
  20. package/templates/dist/drivers/pg-testkit/src/driver/createPgTestkitPool.d.ts +4 -0
  21. package/templates/dist/drivers/pg-testkit/src/driver/createPgTestkitPool.js +71 -0
  22. package/templates/dist/drivers/pg-testkit/src/driver/createPgTestkitPool.js.map +1 -0
  23. package/templates/dist/drivers/pg-testkit/src/index.d.ts +5 -0
  24. package/templates/dist/drivers/pg-testkit/src/index.js +11 -0
  25. package/templates/dist/drivers/pg-testkit/src/index.js.map +1 -0
  26. package/templates/dist/drivers/pg-testkit/src/proxy/wrapPgClient.d.ts +3 -0
  27. package/templates/dist/drivers/pg-testkit/src/proxy/wrapPgClient.js +79 -0
  28. package/templates/dist/drivers/pg-testkit/src/proxy/wrapPgClient.js.map +1 -0
  29. package/templates/dist/drivers/pg-testkit/src/types.d.ts +69 -0
  30. package/templates/dist/drivers/pg-testkit/src/types.js +3 -0
  31. package/templates/dist/drivers/pg-testkit/src/types.js.map +1 -0
  32. package/templates/dist/drivers/pg-testkit/src/utils/fixtureState.d.ts +15 -0
  33. package/templates/dist/drivers/pg-testkit/src/utils/fixtureState.js +34 -0
  34. package/templates/dist/drivers/pg-testkit/src/utils/fixtureState.js.map +1 -0
  35. package/templates/dist/drivers/pg-testkit/src/utils/fixtureValidation.d.ts +12 -0
  36. package/templates/dist/drivers/pg-testkit/src/utils/fixtureValidation.js +53 -0
  37. package/templates/dist/drivers/pg-testkit/src/utils/fixtureValidation.js.map +1 -0
  38. package/templates/dist/mapper-core/src/index.d.ts +160 -0
  39. package/templates/dist/mapper-core/src/index.js +637 -0
  40. package/templates/dist/mapper-core/src/index.js.map +1 -0
  41. package/templates/dist/testkit-core/src/errors/index.d.ts +49 -0
  42. package/templates/dist/testkit-core/src/errors/index.js +111 -0
  43. package/templates/dist/testkit-core/src/errors/index.js.map +1 -0
  44. package/templates/dist/testkit-core/src/fixtures/ColumnAffinity.d.ts +5 -0
  45. package/templates/dist/testkit-core/src/fixtures/ColumnAffinity.js +29 -0
  46. package/templates/dist/testkit-core/src/fixtures/ColumnAffinity.js.map +1 -0
  47. package/templates/dist/testkit-core/src/fixtures/DdlFixtureLoader.d.ts +37 -0
  48. package/templates/dist/testkit-core/src/fixtures/DdlFixtureLoader.js +182 -0
  49. package/templates/dist/testkit-core/src/fixtures/DdlFixtureLoader.js.map +1 -0
  50. package/templates/dist/testkit-core/src/fixtures/FixtureProvider.d.ts +20 -0
  51. package/templates/dist/testkit-core/src/fixtures/FixtureProvider.js +121 -0
  52. package/templates/dist/testkit-core/src/fixtures/FixtureProvider.js.map +1 -0
  53. package/templates/dist/testkit-core/src/fixtures/FixtureStore.d.ts +51 -0
  54. package/templates/dist/testkit-core/src/fixtures/FixtureStore.js +199 -0
  55. package/templates/dist/testkit-core/src/fixtures/FixtureStore.js.map +1 -0
  56. package/templates/dist/testkit-core/src/fixtures/TableDefinitionSchemaRegistry.d.ts +10 -0
  57. package/templates/dist/testkit-core/src/fixtures/TableDefinitionSchemaRegistry.js +28 -0
  58. package/templates/dist/testkit-core/src/fixtures/TableDefinitionSchemaRegistry.js.map +1 -0
  59. package/templates/dist/testkit-core/src/fixtures/TableNameResolver.d.ts +18 -0
  60. package/templates/dist/testkit-core/src/fixtures/TableNameResolver.js +80 -0
  61. package/templates/dist/testkit-core/src/fixtures/TableNameResolver.js.map +1 -0
  62. package/templates/dist/testkit-core/src/fixtures/ddlLint.d.ts +59 -0
  63. package/templates/dist/testkit-core/src/fixtures/ddlLint.js +489 -0
  64. package/templates/dist/testkit-core/src/fixtures/ddlLint.js.map +1 -0
  65. package/templates/dist/testkit-core/src/fixtures/naming.d.ts +1 -0
  66. package/templates/dist/testkit-core/src/fixtures/naming.js +6 -0
  67. package/templates/dist/testkit-core/src/fixtures/naming.js.map +1 -0
  68. package/templates/dist/testkit-core/src/index.d.ts +17 -0
  69. package/templates/dist/testkit-core/src/index.js +47 -0
  70. package/templates/dist/testkit-core/src/index.js.map +1 -0
  71. package/templates/dist/testkit-core/src/logger/NoopLogger.d.ts +8 -0
  72. package/templates/dist/testkit-core/src/logger/NoopLogger.js +16 -0
  73. package/templates/dist/testkit-core/src/logger/NoopLogger.js.map +1 -0
  74. package/templates/dist/testkit-core/src/provider/TestkitProvider.d.ts +57 -0
  75. package/templates/dist/testkit-core/src/provider/TestkitProvider.js +149 -0
  76. package/templates/dist/testkit-core/src/provider/TestkitProvider.js.map +1 -0
  77. package/templates/dist/testkit-core/src/rewriter/ResultSelectRewriter.d.ts +43 -0
  78. package/templates/dist/testkit-core/src/rewriter/ResultSelectRewriter.js +473 -0
  79. package/templates/dist/testkit-core/src/rewriter/ResultSelectRewriter.js.map +1 -0
  80. package/templates/dist/testkit-core/src/rewriter/SelectAnalyzer.d.ts +9 -0
  81. package/templates/dist/testkit-core/src/rewriter/SelectAnalyzer.js +38 -0
  82. package/templates/dist/testkit-core/src/rewriter/SelectAnalyzer.js.map +1 -0
  83. package/templates/dist/testkit-core/src/rewriter/SelectFixtureRewriter.d.ts +42 -0
  84. package/templates/dist/testkit-core/src/rewriter/SelectFixtureRewriter.js +298 -0
  85. package/templates/dist/testkit-core/src/rewriter/SelectFixtureRewriter.js.map +1 -0
  86. package/templates/dist/testkit-core/src/sql/SqliteValuesBuilder.d.ts +12 -0
  87. package/templates/dist/testkit-core/src/sql/SqliteValuesBuilder.js +63 -0
  88. package/templates/dist/testkit-core/src/sql/SqliteValuesBuilder.js.map +1 -0
  89. package/templates/dist/testkit-core/src/types/index.d.ts +69 -0
  90. package/templates/dist/testkit-core/src/types/index.js +3 -0
  91. package/templates/dist/testkit-core/src/types/index.js.map +1 -0
  92. package/templates/dist/testkit-core/src/utils/queryHelpers.d.ts +28 -0
  93. package/templates/dist/testkit-core/src/utils/queryHelpers.js +81 -0
  94. package/templates/dist/testkit-core/src/utils/queryHelpers.js.map +1 -0
  95. package/templates/dist/writer-core/src/index.d.ts +34 -0
  96. package/templates/dist/writer-core/src/index.js +115 -0
  97. package/templates/dist/writer-core/src/index.js.map +1 -0
  98. package/templates/dist/ztd-cli/templates/src/db/sql-client.d.ts +20 -0
  99. package/templates/dist/ztd-cli/templates/src/db/sql-client.js +3 -0
  100. package/templates/dist/ztd-cli/templates/src/db/sql-client.js.map +1 -0
  101. package/templates/dist/ztd-cli/templates/src/db/sql-client.ts +24 -0
  102. package/templates/dist/ztd-cli/templates/src/repositories/user-accounts.d.ts +36 -0
  103. package/templates/dist/ztd-cli/templates/src/repositories/user-accounts.js +85 -0
  104. package/templates/dist/ztd-cli/templates/src/repositories/user-accounts.js.map +1 -0
  105. package/templates/dist/ztd-cli/templates/tests/generated/ztd-row-map.generated.d.ts +20 -0
  106. package/templates/dist/ztd-cli/templates/tests/generated/ztd-row-map.generated.js +33 -0
  107. package/templates/dist/ztd-cli/templates/tests/generated/ztd-row-map.generated.js.map +1 -0
  108. package/templates/dist/ztd-cli/templates/tests/support/global-setup.d.ts +10 -0
  109. package/templates/dist/ztd-cli/templates/tests/support/global-setup.js +29 -0
  110. package/templates/dist/ztd-cli/templates/tests/support/global-setup.js.map +1 -0
  111. package/templates/dist/ztd-cli/templates/tests/support/testkit-client.d.ts +66 -0
  112. package/templates/dist/ztd-cli/templates/tests/support/testkit-client.js +552 -0
  113. package/templates/dist/ztd-cli/templates/tests/support/testkit-client.js.map +1 -0
  114. package/templates/dist/ztd-cli/templates/tests/user-profiles.test.d.ts +1 -0
  115. package/templates/dist/ztd-cli/templates/tests/user-profiles.test.js +82 -0
  116. package/templates/dist/ztd-cli/templates/tests/user-profiles.test.js.map +1 -0
  117. package/templates/dist/ztd-cli/templates/tests/writer-constraints.test.d.ts +1 -0
  118. package/templates/dist/ztd-cli/templates/tests/writer-constraints.test.js +29 -0
  119. package/templates/dist/ztd-cli/templates/tests/writer-constraints.test.js.map +1 -0
  120. package/templates/dist/ztd-cli/templates/tests/ztd-layout.generated.d.ts +7 -0
  121. package/templates/dist/ztd-cli/templates/tests/ztd-layout.generated.js +10 -0
  122. package/templates/dist/ztd-cli/templates/tests/ztd-layout.generated.js.map +1 -0
  123. package/templates/src/AGENTS.md +26 -0
  124. package/templates/src/catalog/AGENTS.md +37 -0
  125. package/templates/src/catalog/runtime/AGENTS.md +75 -0
  126. package/templates/src/catalog/runtime/_coercions.ts +1 -0
  127. package/templates/src/catalog/runtime/_smoke.runtime.ts +21 -0
  128. package/templates/src/catalog/specs/AGENTS.md +48 -0
  129. package/templates/src/catalog/specs/_smoke.spec.arktype.ts +21 -0
  130. package/templates/src/catalog/specs/_smoke.spec.zod.ts +20 -0
  131. package/templates/src/db/sql-client.ts +5 -5
  132. package/templates/src/jobs/AGENTS.md +26 -0
  133. package/templates/src/jobs/README.md +3 -0
  134. package/templates/src/repositories/AGENTS.md +118 -0
  135. package/templates/src/repositories/tables/AGENTS.md +94 -0
  136. package/templates/src/repositories/tables/README.md +3 -0
  137. package/templates/src/repositories/views/AGENTS.md +25 -0
  138. package/templates/src/repositories/views/README.md +3 -0
  139. package/templates/src/sql/AGENTS.md +77 -0
  140. package/templates/src/sql/README.md +6 -0
  141. package/templates/tests/AGENTS.md +43 -129
  142. package/templates/tests/generated/AGENTS.md +16 -0
  143. package/templates/tests/smoke.test.ts +5 -0
  144. package/templates/tests/smoke.validation.test.ts +34 -0
  145. package/templates/tests/support/AGENTS.md +26 -0
  146. package/templates/tests/support/global-setup.ts +8 -23
  147. package/templates/tests/support/testkit-client.ts +13 -741
  148. package/templates/tests/ztd-layout.generated.ts +0 -2
  149. package/templates/tsconfig.json +9 -3
  150. package/templates/ztd/AGENTS.md +11 -142
  151. package/templates/ztd/README.md +4 -82
  152. package/templates/ztd/ddl/AGENTS.md +34 -0
  153. package/templates/ztd/ddl/demo.sql +74 -0
@@ -0,0 +1,49 @@
1
+ import type { MissingFixtureStrategy } from '../types';
2
+ import type { DdlLintDiagnostic } from '../fixtures/ddlLint';
3
+ export interface MissingFixtureColumnDetail {
4
+ name: string;
5
+ typeName: string;
6
+ }
7
+ export interface MissingFixtureDiagnostics {
8
+ tableName: string;
9
+ sql?: string;
10
+ strategy: MissingFixtureStrategy;
11
+ schemaColumns?: MissingFixtureColumnDetail[];
12
+ schemaSource?: 'fixture' | 'schema';
13
+ }
14
+ /**
15
+ * Raised when the rewriter cannot locate fixture data for a referenced table.
16
+ */
17
+ export declare class MissingFixtureError extends Error {
18
+ readonly diagnostics: MissingFixtureDiagnostics;
19
+ constructor(diagnostics: MissingFixtureDiagnostics);
20
+ private static buildMessage;
21
+ /**
22
+ * Produces a compact preview of the provided SQL snippet for diagnostics.
23
+ */
24
+ private static formatSqlSnippet;
25
+ /**
26
+ * Builds a human-readable template that mirrors the missing fixture schema.
27
+ */
28
+ private static buildFixtureTemplate;
29
+ }
30
+ /**
31
+ * Signals that a fixture schema definition lacks required metadata or is inconsistent.
32
+ */
33
+ export declare class SchemaValidationError extends Error {
34
+ constructor(message: string);
35
+ }
36
+ /**
37
+ * Wraps unexpected failures encountered during select statement rewriting.
38
+ */
39
+ export declare class QueryRewriteError extends Error {
40
+ readonly cause?: unknown | undefined;
41
+ constructor(message: string, cause?: unknown | undefined);
42
+ }
43
+ /**
44
+ * Raised when DDL linting detects integrity issues.
45
+ */
46
+ export declare class DdlLintError extends Error {
47
+ readonly diagnostics: DdlLintDiagnostic[];
48
+ constructor(diagnostics: DdlLintDiagnostic[]);
49
+ }
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DdlLintError = exports.QueryRewriteError = exports.SchemaValidationError = exports.MissingFixtureError = void 0;
4
+ const ddlLint_1 = require("../fixtures/ddlLint");
5
+ /**
6
+ * Raised when the rewriter cannot locate fixture data for a referenced table.
7
+ */
8
+ class MissingFixtureError extends Error {
9
+ constructor(diagnostics) {
10
+ super(MissingFixtureError.buildMessage(diagnostics));
11
+ this.diagnostics = diagnostics;
12
+ this.name = 'MissingFixtureError';
13
+ }
14
+ static buildMessage(diagnostics) {
15
+ const lines = [];
16
+ lines.push(`Fixture for table "${diagnostics.tableName}" was not provided.`);
17
+ lines.push('');
18
+ lines.push('Diagnostics:');
19
+ lines.push(` - Strategy: ${diagnostics.strategy}`);
20
+ lines.push(` - Table: ${diagnostics.tableName}`);
21
+ if (diagnostics.sql) {
22
+ lines.push(` - SQL snippet: ${MissingFixtureError.formatSqlSnippet(diagnostics.sql)}`);
23
+ }
24
+ if (diagnostics.schemaColumns && diagnostics.schemaColumns.length > 0) {
25
+ const sourceLabel = diagnostics.schemaSource === 'schema' ? 'schema registry' : 'fixture metadata';
26
+ lines.push(` - Required columns (${sourceLabel}):`);
27
+ diagnostics.schemaColumns.forEach((column) => {
28
+ lines.push(` • ${column.name} (${column.typeName})`);
29
+ });
30
+ lines.push(' - Suggested fixture template:');
31
+ lines.push(...MissingFixtureError.buildFixtureTemplate(diagnostics.tableName, diagnostics.schemaColumns));
32
+ }
33
+ else {
34
+ lines.push(' - Column definitions: unavailable. Register schema via options.schema or include schema per fixture.');
35
+ }
36
+ lines.push('');
37
+ lines.push('Next steps:');
38
+ lines.push(' 1. Declare a fixture for the table with the columns listed above.');
39
+ lines.push(' 2. Provide at least one row so rewritten SELECT statements shadow the physical table.');
40
+ lines.push(' 3. Pass fixtures via SelectRewriterOptions.fixtures or rewrite context overrides.');
41
+ return lines.join('\n');
42
+ }
43
+ /**
44
+ * Produces a compact preview of the provided SQL snippet for diagnostics.
45
+ */
46
+ static formatSqlSnippet(sql) {
47
+ const compact = sql.replace(/\s+/g, ' ').trim();
48
+ const limit = 280;
49
+ if (compact.length <= limit) {
50
+ return compact;
51
+ }
52
+ return `${compact.slice(0, limit)}…`;
53
+ }
54
+ /**
55
+ * Builds a human-readable template that mirrors the missing fixture schema.
56
+ */
57
+ static buildFixtureTemplate(tableName, columns) {
58
+ const indent = (level) => ' '.repeat(level * 2);
59
+ const template = [];
60
+ template.push(`${indent(3)}{`);
61
+ template.push(`${indent(4)}tableName: '${tableName}',`);
62
+ template.push(`${indent(4)}schema: {`);
63
+ template.push(`${indent(5)}columns: {`);
64
+ columns.forEach((column, index) => {
65
+ const suffix = index === columns.length - 1 ? '' : ',';
66
+ template.push(`${indent(6)}${column.name}: '${column.typeName}'${suffix}`);
67
+ });
68
+ template.push(`${indent(5)}}`);
69
+ template.push(`${indent(4)}},`);
70
+ template.push(`${indent(4)}rows: [`);
71
+ const rowExample = columns.map((column) => `${column.name}: /* ${column.typeName} */`).join(', ');
72
+ template.push(`${indent(5)}{ ${rowExample} }`);
73
+ template.push(`${indent(4)}],`);
74
+ template.push(`${indent(3)}}`);
75
+ return template;
76
+ }
77
+ }
78
+ exports.MissingFixtureError = MissingFixtureError;
79
+ /**
80
+ * Signals that a fixture schema definition lacks required metadata or is inconsistent.
81
+ */
82
+ class SchemaValidationError extends Error {
83
+ constructor(message) {
84
+ super(message);
85
+ this.name = 'SchemaValidationError';
86
+ }
87
+ }
88
+ exports.SchemaValidationError = SchemaValidationError;
89
+ /**
90
+ * Wraps unexpected failures encountered during select statement rewriting.
91
+ */
92
+ class QueryRewriteError extends Error {
93
+ constructor(message, cause) {
94
+ super(message);
95
+ this.cause = cause;
96
+ this.name = 'QueryRewriteError';
97
+ }
98
+ }
99
+ exports.QueryRewriteError = QueryRewriteError;
100
+ /**
101
+ * Raised when DDL linting detects integrity issues.
102
+ */
103
+ class DdlLintError extends Error {
104
+ constructor(diagnostics) {
105
+ super((0, ddlLint_1.formatDdlLintDiagnostics)(diagnostics));
106
+ this.diagnostics = diagnostics;
107
+ this.name = 'DdlLintError';
108
+ }
109
+ }
110
+ exports.DdlLintError = DdlLintError;
111
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../testkit-core/src/errors/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type ColumnAffinity = 'TEXT' | 'INTEGER' | 'REAL' | 'NUMERIC' | 'BLOB';
2
+ /**
3
+ * Guesses the SQLite affinity category from the declared type name using SQLite's affinity rules.
4
+ */
5
+ export declare function guessAffinity(typeName?: string): ColumnAffinity;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.guessAffinity = guessAffinity;
4
+ const DEFAULT_AFFINITY = 'TEXT';
5
+ const affinityPatterns = [
6
+ { pattern: /(int|serial|numeric|decimal|money)/i, affinity: 'INTEGER' },
7
+ { pattern: /(real|double|float)/i, affinity: 'REAL' },
8
+ { pattern: /(blob|bytea|binary|varbinary|raw)/i, affinity: 'BLOB' },
9
+ { pattern: /(bool|boolean)/i, affinity: 'INTEGER' },
10
+ { pattern: /(text|char|string|clob|json)/i, affinity: 'TEXT' },
11
+ ];
12
+ /**
13
+ * Guesses the SQLite affinity category from the declared type name using SQLite's affinity rules.
14
+ */
15
+ function guessAffinity(typeName) {
16
+ if (!typeName) {
17
+ // Fall back to TEXT when the column lacks an explicit type hint.
18
+ return DEFAULT_AFFINITY;
19
+ }
20
+ const normalized = typeName.toLowerCase().trim();
21
+ // Try to match against the ordered heuristics; later entries act as catch-alls.
22
+ for (const entry of affinityPatterns) {
23
+ if (entry.pattern.test(normalized)) {
24
+ return entry.affinity;
25
+ }
26
+ }
27
+ return DEFAULT_AFFINITY;
28
+ }
29
+ //# sourceMappingURL=ColumnAffinity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColumnAffinity.js","sourceRoot":"","sources":["../../../../../../testkit-core/src/fixtures/ColumnAffinity.ts"],"names":[],"mappings":";;AAeA,sCAgBC;AA7BD,MAAM,gBAAgB,GAAmB,MAAM,CAAC;AAEhD,MAAM,gBAAgB,GAAyD;IAC7E,EAAE,OAAO,EAAE,qCAAqC,EAAE,QAAQ,EAAE,SAAS,EAAE;IACvE,EAAE,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,EAAE;IACrD,EAAE,OAAO,EAAE,oCAAoC,EAAE,QAAQ,EAAE,MAAM,EAAE;IACnE,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE;IACnD,EAAE,OAAO,EAAE,+BAA+B,EAAE,QAAQ,EAAE,MAAM,EAAE;CAC/D,CAAC;AAEF;;GAEG;AACH,SAAgB,aAAa,CAAC,QAAiB;IAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,iEAAiE;QACjE,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAEjD,gFAAgF;IAChF,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,OAAO,KAAK,CAAC,QAAQ,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { TableDefinitionModel } from 'rawsql-ts';
2
+ import type { FixtureRow } from '../types';
3
+ import { TableNameResolver } from './TableNameResolver';
4
+ import { type DdlLintMode } from './ddlLint';
5
+ export interface DdlFixtureLoaderOptions {
6
+ directories: string[];
7
+ extensions?: string[];
8
+ tableNameResolver?: TableNameResolver;
9
+ ddlLint?: DdlLintMode;
10
+ }
11
+ export interface DdlProcessedFixture {
12
+ tableDefinition: TableDefinitionModel;
13
+ rows?: FixtureRow[];
14
+ }
15
+ export declare class DdlFixtureLoader {
16
+ private readonly options;
17
+ private static readonly cache;
18
+ private readonly resolvedDirectories;
19
+ private readonly extensions;
20
+ private readonly cacheKey;
21
+ private fixtures;
22
+ private fixturesByName;
23
+ private loaded;
24
+ private readonly tableNameResolver?;
25
+ private readonly ddlLintMode;
26
+ constructor(options: DdlFixtureLoaderOptions);
27
+ getFixtures(): DdlProcessedFixture[];
28
+ getFixture(tableName: string): DdlProcessedFixture | undefined;
29
+ private ensureLoaded;
30
+ private registerFixtures;
31
+ private loadFromDirectories;
32
+ private collectSqlFiles;
33
+ private loadFile;
34
+ private static buildCacheKey;
35
+ private runDdlLint;
36
+ private resolveTableKey;
37
+ }
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DdlFixtureLoader = void 0;
7
+ const node_fs_1 = require("node:fs");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const rawsql_ts_1 = require("rawsql-ts");
10
+ const ddlLint_1 = require("./ddlLint");
11
+ const errors_1 = require("../errors");
12
+ class DdlFixtureLoader {
13
+ constructor(options) {
14
+ var _a;
15
+ this.options = options;
16
+ this.fixtures = [];
17
+ this.fixturesByName = new Map();
18
+ this.loaded = false;
19
+ // Resolve directories up front so cache keys stay consistent across calls.
20
+ this.resolvedDirectories = options.directories.map((directory) => node_path_1.default.resolve(directory));
21
+ this.extensions = ((_a = options.extensions) !== null && _a !== void 0 ? _a : ['.sql']).map((ext) => ext.toLowerCase());
22
+ // Include resolver settings in the cache key to avoid mixing schema snapshots.
23
+ this.cacheKey = DdlFixtureLoader.buildCacheKey(this.resolvedDirectories, this.extensions, options.tableNameResolver, (0, ddlLint_1.normalizeDdlLintMode)(options.ddlLint));
24
+ this.tableNameResolver = options.tableNameResolver;
25
+ this.ddlLintMode = (0, ddlLint_1.normalizeDdlLintMode)(options.ddlLint);
26
+ }
27
+ getFixtures() {
28
+ this.ensureLoaded();
29
+ return [...this.fixtures];
30
+ }
31
+ getFixture(tableName) {
32
+ this.ensureLoaded();
33
+ const normalized = (0, rawsql_ts_1.normalizeTableName)(tableName);
34
+ return this.fixturesByName.get(normalized);
35
+ }
36
+ ensureLoaded() {
37
+ if (this.loaded) {
38
+ return;
39
+ }
40
+ // Reuse previously parsed fixtures when the same directories were processed before.
41
+ const cached = DdlFixtureLoader.cache.get(this.cacheKey);
42
+ if (cached) {
43
+ this.registerFixtures(cached);
44
+ this.loaded = true;
45
+ return;
46
+ }
47
+ // Load fixtures from disk and store them in the shared cache key.
48
+ const collected = this.loadFromDirectories();
49
+ DdlFixtureLoader.cache.set(this.cacheKey, collected);
50
+ this.registerFixtures(collected);
51
+ this.loaded = true;
52
+ }
53
+ registerFixtures(fixtures) {
54
+ this.fixtures = fixtures;
55
+ this.fixturesByName = new Map();
56
+ for (const fixture of fixtures) {
57
+ const normalized = this.resolveTableKey(fixture.tableDefinition.name);
58
+ this.fixturesByName.set(normalized, fixture);
59
+ }
60
+ }
61
+ loadFromDirectories() {
62
+ // Verify every configured directory exists before scanning to provide fail-fast diagnostics.
63
+ const missingDirectories = this.resolvedDirectories.filter((directory) => !(0, node_fs_1.existsSync)(directory));
64
+ if (missingDirectories.length) {
65
+ throw new Error(`DDL directories were not found: ${missingDirectories.join(', ')}. Please review the configured ddl.directories paths.`);
66
+ }
67
+ const fixtures = [];
68
+ const diagnostics = { sqlFileCount: 0 };
69
+ const sources = [];
70
+ // Walk each directory recursively to collect SQL files and keep track of what was discovered.
71
+ for (const directory of this.resolvedDirectories) {
72
+ this.collectSqlFiles(directory, fixtures, diagnostics, sources);
73
+ }
74
+ if (diagnostics.sqlFileCount === 0) {
75
+ throw new Error(`No SQL files (${this.extensions.join(', ')}) were discovered under ${this.resolvedDirectories.join(', ')}. Please place valid SQL fixtures in the configured directories.`);
76
+ }
77
+ // Run lint checks before enforcing CREATE TABLE presence so actionable diagnostics surface first.
78
+ this.runDdlLint(sources);
79
+ if (fixtures.length === 0) {
80
+ throw new Error(`SQL files were found under ${this.resolvedDirectories.join(', ')}, but no CREATE TABLE statements produced fixtures. Please verify the files contain valid DDL.`);
81
+ }
82
+ return fixtures;
83
+ }
84
+ collectSqlFiles(directory, fixtures, diagnostics, sources) {
85
+ // Skip directories that are missing so optional paths are acceptable.
86
+ if (!(0, node_fs_1.existsSync)(directory)) {
87
+ return;
88
+ }
89
+ const entries = (0, node_fs_1.readdirSync)(directory, { withFileTypes: true });
90
+ for (const entry of entries) {
91
+ const resolved = node_path_1.default.join(directory, entry.name);
92
+ if (entry.isDirectory()) {
93
+ this.collectSqlFiles(resolved, fixtures, diagnostics, sources);
94
+ continue;
95
+ }
96
+ const extension = node_path_1.default.extname(entry.name).toLowerCase();
97
+ if (!entry.isFile() || !this.extensions.includes(extension)) {
98
+ continue;
99
+ }
100
+ // Record that a SQL file was encountered regardless of whether it contained definitions.
101
+ diagnostics.sqlFileCount += 1;
102
+ this.loadFile(resolved, fixtures, sources);
103
+ }
104
+ }
105
+ loadFile(filePath, fixtures, sources) {
106
+ var _a, _b;
107
+ const sql = (0, node_fs_1.readFileSync)(filePath, 'utf8');
108
+ if (!sql.trim()) {
109
+ return;
110
+ }
111
+ // Preserve a workspace-relative path so diagnostics remain portable.
112
+ const sourcePath = node_path_1.default
113
+ .relative(process.cwd(), filePath)
114
+ .replace(/\\/g, '/');
115
+ sources.push({ path: sourcePath, sql });
116
+ // Convert every CREATE TABLE/INSERT block into a table definition bundle.
117
+ const fixtureJson = rawsql_ts_1.DDLToFixtureConverter.convert(sql);
118
+ for (const [tableName, definition] of Object.entries(fixtureJson)) {
119
+ const rawDefinition = definition;
120
+ const columns = (_b = (_a = rawDefinition.columns) === null || _a === void 0 ? void 0 : _a.map((column) => {
121
+ var _a;
122
+ return ({
123
+ name: column.name,
124
+ typeName: column.type,
125
+ required: false,
126
+ defaultValue: (_a = column.default) !== null && _a !== void 0 ? _a : null,
127
+ });
128
+ })) !== null && _b !== void 0 ? _b : [];
129
+ const rows = Array.isArray(rawDefinition.rows) && rawDefinition.rows.length > 0 ? rawDefinition.rows : undefined;
130
+ // Avoid duplicate fixtures for the same canonical table key.
131
+ const canonicalKey = this.resolveTableKey(tableName);
132
+ if (fixtures.some((fixture) => this.resolveTableKey(fixture.tableDefinition.name) === canonicalKey)) {
133
+ continue;
134
+ }
135
+ fixtures.push({
136
+ tableDefinition: {
137
+ name: tableName,
138
+ columns,
139
+ },
140
+ rows,
141
+ });
142
+ }
143
+ }
144
+ static buildCacheKey(directories, extensions, resolver, ddlLintMode = ddlLint_1.DEFAULT_DDL_LINT_MODE) {
145
+ var _a;
146
+ // Normalize directories and extensions so the cache key stays deterministic regardless of iteration order.
147
+ const normalizedDirectories = [...directories].sort();
148
+ const normalizedExtensions = [...extensions]
149
+ .map((ext) => ext.toLowerCase())
150
+ .sort();
151
+ // Include resolver configuration in the key so different schema search paths do not share the same cache.
152
+ const resolverSegment = `|resolver:${(_a = resolver === null || resolver === void 0 ? void 0 : resolver.toCacheKey()) !== null && _a !== void 0 ? _a : 'none'}`;
153
+ return `${normalizedDirectories.join('|')}|${normalizedExtensions.join('|')}${resolverSegment}|ddlLint:${ddlLintMode}`;
154
+ }
155
+ runDdlLint(sources) {
156
+ if (this.ddlLintMode === 'off' || sources.length === 0) {
157
+ return;
158
+ }
159
+ // Always lint with resolver context so unqualified references resolve deterministically.
160
+ const diagnostics = (0, ddlLint_1.lintDdlSources)(sources, {
161
+ tableNameResolver: this.tableNameResolver,
162
+ });
163
+ if (diagnostics.length === 0) {
164
+ return;
165
+ }
166
+ const adjusted = (0, ddlLint_1.applyDdlLintMode)(diagnostics, this.ddlLintMode);
167
+ if (this.ddlLintMode === 'strict') {
168
+ throw new errors_1.DdlLintError(adjusted);
169
+ }
170
+ console.warn((0, ddlLint_1.formatDdlLintDiagnostics)(adjusted));
171
+ }
172
+ // Map raw table names into their canonical schema-qualified keys for deduplication.
173
+ resolveTableKey(tableName) {
174
+ if (!this.tableNameResolver) {
175
+ return (0, rawsql_ts_1.normalizeTableName)(tableName);
176
+ }
177
+ return this.tableNameResolver.resolve(tableName);
178
+ }
179
+ }
180
+ exports.DdlFixtureLoader = DdlFixtureLoader;
181
+ DdlFixtureLoader.cache = new Map();
182
+ //# sourceMappingURL=DdlFixtureLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DdlFixtureLoader.js","sourceRoot":"","sources":["../../../../../../testkit-core/src/fixtures/DdlFixtureLoader.ts"],"names":[],"mappings":";;;;;;AAAA,qCAAgE;AAChE,0DAA6B;AAC7B,yCAAsE;AAItE,uCAQmB;AACnB,sCAAyC;AAuBzC,MAAa,gBAAgB;IAW3B,YAA6B,OAAgC;;QAAhC,YAAO,GAAP,OAAO,CAAyB;QANrD,aAAQ,GAA0B,EAAE,CAAC;QACrC,mBAAc,GAAG,IAAI,GAAG,EAA+B,CAAC;QACxD,WAAM,GAAG,KAAK,CAAC;QAKrB,2EAA2E;QAC3E,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,mBAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3F,IAAI,CAAC,UAAU,GAAG,CAAC,MAAA,OAAO,CAAC,UAAU,mCAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QACnF,+EAA+E;QAC/E,IAAI,CAAC,QAAQ,GAAG,gBAAgB,CAAC,aAAa,CAC5C,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,UAAU,EACf,OAAO,CAAC,iBAAiB,EACzB,IAAA,8BAAoB,EAAC,OAAO,CAAC,OAAO,CAAC,CACtC,CAAC;QACF,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACnD,IAAI,CAAC,WAAW,GAAG,IAAA,8BAAoB,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,CAAC;IAEM,WAAW;QAChB,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAEM,UAAU,CAAC,SAAiB;QACjC,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,UAAU,GAAG,IAAA,8BAAkB,EAAC,SAAS,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,oFAAoF;QACpF,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,OAAO;QACT,CAAC;QAED,kEAAkE;QAClE,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7C,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAEO,gBAAgB,CAAC,QAA+B;QACtD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;QAEhC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACtE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAEO,mBAAmB;QACzB,6FAA6F;QAC7F,MAAM,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAA,oBAAU,EAAC,SAAS,CAAC,CAAC,CAAC;QAClG,IAAI,kBAAkB,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CACb,mCAAmC,kBAAkB,CAAC,IAAI,CACxD,IAAI,CACL,uDAAuD,CACzD,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAA0B,EAAE,CAAC;QAC3C,MAAM,WAAW,GAAmB,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;QACxD,MAAM,OAAO,GAAoB,EAAE,CAAC;QAEpC,8FAA8F;QAC9F,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACjD,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,WAAW,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,iBAAiB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,2BAA2B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CACjG,IAAI,CACL,kEAAkE,CACpE,CAAC;QACJ,CAAC;QAED,kGAAkG;QAClG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAEzB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,8BAA8B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CACzD,IAAI,CACL,gGAAgG,CAClG,CAAC;QACJ,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,eAAe,CACrB,SAAiB,EACjB,QAA+B,EAC/B,WAA2B,EAC3B,OAAwB;QAExB,sEAAsE;QACtE,IAAI,CAAC,IAAA,oBAAU,EAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;gBAC/D,SAAS;YACX,CAAC;YAED,MAAM,SAAS,GAAG,mBAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YACzD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC5D,SAAS;YACX,CAAC;YAED,yFAAyF;YACzF,WAAW,CAAC,YAAY,IAAI,CAAC,CAAC;YAE9B,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAEO,QAAQ,CACd,QAAgB,EAChB,QAA+B,EAC/B,OAAwB;;QAExB,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,qEAAqE;QACrE,MAAM,UAAU,GAAG,mBAAI;aACpB,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC;aACjC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAExC,0EAA0E;QAC1E,MAAM,WAAW,GAAG,iCAAqB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvD,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAClE,MAAM,aAAa,GAAG,UAAkC,CAAC;YAEzD,MAAM,OAAO,GACX,MAAA,MAAA,aAAa,CAAC,OAAO,0CAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;;gBAAC,OAAA,CAAC;oBACtC,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,QAAQ,EAAE,MAAM,CAAC,IAAI;oBACrB,QAAQ,EAAE,KAAK;oBACf,YAAY,EAAE,MAAA,MAAM,CAAC,OAAO,mCAAI,IAAI;iBACrC,CAAC,CAAA;aAAA,CAAC,mCAAI,EAAE,CAAC;YAEZ,MAAM,IAAI,GACR,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YAEtG,6DAA6D;YAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YACrD,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,YAAY,CAAC,EAAE,CAAC;gBACpG,SAAS;YACX,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC;gBACZ,eAAe,EAAE;oBACf,IAAI,EAAE,SAAS;oBACf,OAAO;iBACR;gBACD,IAAI;aACL,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,aAAa,CAC1B,WAAqB,EACrB,UAAoB,EACpB,QAA4B,EAC5B,cAA2B,+BAAqB;;QAEhD,2GAA2G;QAC3G,MAAM,qBAAqB,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;QACtD,MAAM,oBAAoB,GAAG,CAAC,GAAG,UAAU,CAAC;aACzC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;aAC/B,IAAI,EAAE,CAAC;QAEV,0GAA0G;QAC1G,MAAM,eAAe,GAAG,aAAa,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,UAAU,EAAE,mCAAI,MAAM,EAAE,CAAC;QACxE,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,eAAe,YAAY,WAAW,EAAE,CAAC;IACzH,CAAC;IAEO,UAAU,CAAC,OAAwB;QACzC,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvD,OAAO;QACT,CAAC;QAED,yFAAyF;QACzF,MAAM,WAAW,GAAG,IAAA,wBAAc,EAAC,OAAO,EAAE;YAC1C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;SAC1C,CAAC,CAAC;QACH,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,IAAA,0BAAgB,EAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACjE,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,qBAAY,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,IAAA,kCAAwB,EAAC,QAAQ,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,oFAAoF;IAC5E,eAAe,CAAC,SAAiB;QACvC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,OAAO,IAAA,8BAAkB,EAAC,SAAS,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;;AAxOH,4CAyOC;AAxOyB,sBAAK,GAAG,IAAI,GAAG,EAAiC,AAA3C,CAA4C"}
@@ -0,0 +1,20 @@
1
+ import type { TableDefinitionModel } from 'rawsql-ts';
2
+ import type { TableRowsFixture } from '../types';
3
+ import type { FixtureResolver, FixtureSnapshot } from '../types';
4
+ import { TableNameResolver } from './TableNameResolver';
5
+ /** Resolves fixtures while unifying table metadata coming from DDL or explicit configuration. */
6
+ export declare class DefaultFixtureProvider implements FixtureResolver {
7
+ private readonly baseRows;
8
+ private readonly tableNameResolver?;
9
+ private readonly definitionMap;
10
+ constructor(tableDefinitions?: TableDefinitionModel[], baseRows?: TableRowsFixture[], tableNameResolver?: TableNameResolver | undefined);
11
+ resolve(overrides?: TableRowsFixture[]): FixtureSnapshot;
12
+ private registerDefinitions;
13
+ private mergeRows;
14
+ private buildFixtureTables;
15
+ private buildDefinitionRegistry;
16
+ private findDefinition;
17
+ private resolveDefinitionKey;
18
+ private buildRow;
19
+ private coerceValue;
20
+ }
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DefaultFixtureProvider = void 0;
4
+ const rawsql_ts_1 = require("rawsql-ts");
5
+ /** Resolves fixtures while unifying table metadata coming from DDL or explicit configuration. */
6
+ class DefaultFixtureProvider {
7
+ constructor(tableDefinitions = [], baseRows = [], tableNameResolver) {
8
+ this.baseRows = baseRows;
9
+ this.tableNameResolver = tableNameResolver;
10
+ this.definitionMap = new Map();
11
+ this.registerDefinitions(tableDefinitions);
12
+ }
13
+ resolve(overrides) {
14
+ const mergedRows = this.mergeRows(overrides);
15
+ const snapshot = {
16
+ fixtureTables: this.buildFixtureTables(mergedRows),
17
+ tableDefinitions: this.buildDefinitionRegistry(),
18
+ fixturesApplied: mergedRows.map((fixture) => fixture.tableName),
19
+ };
20
+ return snapshot;
21
+ }
22
+ registerDefinitions(definitions) {
23
+ for (const definition of definitions) {
24
+ const key = this.resolveDefinitionKey(definition.name);
25
+ this.definitionMap.set(key, definition);
26
+ }
27
+ }
28
+ mergeRows(overrides) {
29
+ const merged = new Map();
30
+ // Start with the baseline rows so overrides only need to supply deltas.
31
+ for (const fixture of this.baseRows) {
32
+ const lookupKey = this.resolveDefinitionKey(fixture.tableName, (candidate) => this.definitionMap.has(candidate));
33
+ merged.set(lookupKey, fixture);
34
+ }
35
+ // Apply overrides so callers can shadow specific tables per scope.
36
+ for (const fixture of overrides !== null && overrides !== void 0 ? overrides : []) {
37
+ const lookupKey = this.resolveDefinitionKey(fixture.tableName, (candidate) => this.definitionMap.has(candidate));
38
+ merged.set(lookupKey, fixture);
39
+ }
40
+ return [...merged.values()];
41
+ }
42
+ buildFixtureTables(fixtures) {
43
+ const result = [];
44
+ for (const fixture of fixtures) {
45
+ const definition = this.findDefinition(fixture.tableName);
46
+ if (!definition) {
47
+ throw new Error(`Missing table definition for fixture "${fixture.tableName}".`);
48
+ }
49
+ const columns = definition.columns.map((column) => ({
50
+ name: column.name,
51
+ typeName: column.typeName,
52
+ defaultValue: typeof column.defaultValue === 'string' ? column.defaultValue : undefined,
53
+ }));
54
+ const rows = fixture.rows.map((row, rowIndex) => this.buildRow(row, columns, fixture.tableName, rowIndex, definition));
55
+ result.push({ tableName: fixture.tableName, columns, rows });
56
+ }
57
+ return result;
58
+ }
59
+ buildDefinitionRegistry() {
60
+ const registry = {};
61
+ const seen = new Set();
62
+ for (const definition of this.definitionMap.values()) {
63
+ const key = this.resolveDefinitionKey(definition.name);
64
+ if (seen.has(key)) {
65
+ continue;
66
+ }
67
+ registry[key] = definition;
68
+ seen.add(key);
69
+ }
70
+ return registry;
71
+ }
72
+ findDefinition(tableName) {
73
+ const key = this.resolveDefinitionKey(tableName, (candidate) => this.definitionMap.has(candidate));
74
+ return this.definitionMap.get(key);
75
+ }
76
+ // Resolve the canonical key for a table name, optionally preferring any registered schema entry.
77
+ resolveDefinitionKey(tableName, lookup) {
78
+ if (!this.tableNameResolver) {
79
+ return (0, rawsql_ts_1.normalizeTableName)(tableName);
80
+ }
81
+ return this.tableNameResolver.resolve(tableName, lookup);
82
+ }
83
+ buildRow(row, columns, tableName, rowIndex, definition) {
84
+ const normalizedKeys = new Set(Object.keys(row));
85
+ const columnLookup = new Map(definition.columns.map((column) => [column.name, column]));
86
+ // Ensure required columns without defaults are explicitly provided.
87
+ for (const column of columns) {
88
+ const definitionColumn = columnLookup.get(column.name);
89
+ const hasValue = normalizedKeys.has(column.name);
90
+ if (!hasValue &&
91
+ (definitionColumn === null || definitionColumn === void 0 ? void 0 : definitionColumn.required) &&
92
+ !definitionColumn.defaultValue) {
93
+ throw new Error(`Row ${rowIndex} for table "${tableName}" misses required column "${column.name}".`);
94
+ }
95
+ }
96
+ return columns.map((column) => {
97
+ const value = row[column.name];
98
+ if (value === undefined || value === null) {
99
+ return null;
100
+ }
101
+ return this.coerceValue(value);
102
+ });
103
+ }
104
+ coerceValue(value) {
105
+ if (value === null || value === undefined) {
106
+ return null;
107
+ }
108
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint') {
109
+ return value;
110
+ }
111
+ if (typeof Buffer !== 'undefined' && value instanceof Buffer) {
112
+ return value;
113
+ }
114
+ if (typeof value === 'boolean') {
115
+ return value ? 1 : 0;
116
+ }
117
+ return JSON.stringify(value);
118
+ }
119
+ }
120
+ exports.DefaultFixtureProvider = DefaultFixtureProvider;
121
+ //# sourceMappingURL=FixtureProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FixtureProvider.js","sourceRoot":"","sources":["../../../../../../testkit-core/src/fixtures/FixtureProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { TableFixture, SchemaRegistry } from '../types';
2
+ import type { ColumnAffinity } from './ColumnAffinity';
3
+ import { TableNameResolver } from './TableNameResolver';
4
+ export interface ColumnDefinition {
5
+ name: string;
6
+ typeName: string;
7
+ affinity: ColumnAffinity;
8
+ }
9
+ export interface NormalizedFixture {
10
+ name: string;
11
+ columns: ColumnDefinition[];
12
+ rows: (string | number | bigint | Buffer | null)[][];
13
+ }
14
+ export type FixtureColumnSource = 'fixture' | 'schema';
15
+ export interface FixtureColumnDescription {
16
+ columns: ColumnDefinition[];
17
+ source: FixtureColumnSource;
18
+ }
19
+ /**
20
+ * Normalizes and indexes fixture metadata so rewrites can resolve tables and columns deterministically.
21
+ */
22
+ export declare class FixtureStore {
23
+ private readonly schemaRegistry?;
24
+ private readonly tableNameResolver?;
25
+ private readonly baseMap;
26
+ constructor(fixtures?: TableFixture[], schema?: SchemaRegistry, tableNameResolver?: TableNameResolver);
27
+ /**
28
+ * Builds a fixture lookup map that layers per-call overrides on top of the base fixtures.
29
+ * @param overrides - Additional fixtures to merge with the base set.
30
+ * @returns A map keyed by normalized table names.
31
+ */
32
+ withOverrides(overrides?: TableFixture[]): Map<string, NormalizedFixture>;
33
+ /**
34
+ * Retrieves column metadata for the requested table from fixtures or registered schema information.
35
+ * @param tableName - The table identifier potentially qualified by schema.
36
+ * @returns Column details assembled from fixtures or schema registry entries.
37
+ */
38
+ describeColumns(tableName: string): FixtureColumnDescription | undefined;
39
+ private buildMap;
40
+ private getRegisteredSchema;
41
+ private normalizeFixture;
42
+ private resolveTableKey;
43
+ private resolveLookupCandidates;
44
+ private buildColumns;
45
+ private buildColumnsFromSchema;
46
+ private buildColumnsFromDefinition;
47
+ private buildColumnDefinition;
48
+ private isTableDefinitionModel;
49
+ private normalizeRow;
50
+ private normalizeValue;
51
+ }