@memberjunction/cli 5.37.0 → 5.38.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 (150) hide show
  1. package/README.md +74 -0
  2. package/dist/baseline/cli-helpers.d.ts +12 -0
  3. package/dist/baseline/cli-helpers.d.ts.map +1 -0
  4. package/dist/baseline/cli-helpers.js +40 -0
  5. package/dist/baseline/cli-helpers.js.map +1 -0
  6. package/dist/baseline/comparator.d.ts +26 -0
  7. package/dist/baseline/comparator.d.ts.map +1 -0
  8. package/dist/baseline/comparator.js +527 -0
  9. package/dist/baseline/comparator.js.map +1 -0
  10. package/dist/baseline/connection.d.ts +39 -0
  11. package/dist/baseline/connection.d.ts.map +1 -0
  12. package/dist/baseline/connection.js +104 -0
  13. package/dist/baseline/connection.js.map +1 -0
  14. package/dist/baseline/data-dumper.d.ts +23 -0
  15. package/dist/baseline/data-dumper.d.ts.map +1 -0
  16. package/dist/baseline/data-dumper.js +94 -0
  17. package/dist/baseline/data-dumper.js.map +1 -0
  18. package/dist/baseline/emitter.d.ts +36 -0
  19. package/dist/baseline/emitter.d.ts.map +1 -0
  20. package/dist/baseline/emitter.js +512 -0
  21. package/dist/baseline/emitter.js.map +1 -0
  22. package/dist/baseline/index.d.ts +18 -0
  23. package/dist/baseline/index.d.ts.map +1 -0
  24. package/dist/baseline/index.js +14 -0
  25. package/dist/baseline/index.js.map +1 -0
  26. package/dist/baseline/introspector-mssql.d.ts +15 -0
  27. package/dist/baseline/introspector-mssql.d.ts.map +1 -0
  28. package/dist/baseline/introspector-mssql.js +673 -0
  29. package/dist/baseline/introspector-mssql.js.map +1 -0
  30. package/dist/baseline/introspector-postgres.d.ts +14 -0
  31. package/dist/baseline/introspector-postgres.d.ts.map +1 -0
  32. package/dist/baseline/introspector-postgres.js +277 -0
  33. package/dist/baseline/introspector-postgres.js.map +1 -0
  34. package/dist/baseline/report.d.ts +7 -0
  35. package/dist/baseline/report.d.ts.map +1 -0
  36. package/dist/baseline/report.js +105 -0
  37. package/dist/baseline/report.js.map +1 -0
  38. package/dist/baseline/types.d.ts +286 -0
  39. package/dist/baseline/types.d.ts.map +1 -0
  40. package/dist/baseline/types.js +10 -0
  41. package/dist/baseline/types.js.map +1 -0
  42. package/dist/baseline/util.d.ts +112 -0
  43. package/dist/baseline/util.d.ts.map +1 -0
  44. package/dist/baseline/util.js +325 -0
  45. package/dist/baseline/util.js.map +1 -0
  46. package/dist/commands/baseline/build.d.ts +29 -0
  47. package/dist/commands/baseline/build.d.ts.map +1 -0
  48. package/dist/commands/baseline/build.js +188 -0
  49. package/dist/commands/baseline/build.js.map +1 -0
  50. package/dist/commands/baseline/compare.d.ts +19 -0
  51. package/dist/commands/baseline/compare.d.ts.map +1 -0
  52. package/dist/commands/baseline/compare.js +133 -0
  53. package/dist/commands/baseline/compare.js.map +1 -0
  54. package/dist/commands/baseline/roundtrip.d.ts +23 -0
  55. package/dist/commands/baseline/roundtrip.d.ts.map +1 -0
  56. package/dist/commands/baseline/roundtrip.js +245 -0
  57. package/dist/commands/baseline/roundtrip.js.map +1 -0
  58. package/dist/commands/test/compare.d.ts +3 -0
  59. package/dist/commands/test/compare.d.ts.map +1 -1
  60. package/dist/commands/test/compare.js +23 -3
  61. package/dist/commands/test/compare.js.map +1 -1
  62. package/dist/commands/test/regression/build.d.ts +14 -0
  63. package/dist/commands/test/regression/build.d.ts.map +1 -0
  64. package/dist/commands/test/regression/build.js +48 -0
  65. package/dist/commands/test/regression/build.js.map +1 -0
  66. package/dist/commands/test/regression/compare.d.ts +15 -0
  67. package/dist/commands/test/regression/compare.d.ts.map +1 -0
  68. package/dist/commands/test/regression/compare.js +66 -0
  69. package/dist/commands/test/regression/compare.js.map +1 -0
  70. package/dist/commands/test/regression/down.d.ts +10 -0
  71. package/dist/commands/test/regression/down.d.ts.map +1 -0
  72. package/dist/commands/test/regression/down.js +29 -0
  73. package/dist/commands/test/regression/down.js.map +1 -0
  74. package/dist/commands/test/regression/export.d.ts +11 -0
  75. package/dist/commands/test/regression/export.d.ts.map +1 -0
  76. package/dist/commands/test/regression/export.js +56 -0
  77. package/dist/commands/test/regression/export.js.map +1 -0
  78. package/dist/commands/test/regression/gen-forms.d.ts +7 -0
  79. package/dist/commands/test/regression/gen-forms.d.ts.map +1 -0
  80. package/dist/commands/test/regression/gen-forms.js +18 -0
  81. package/dist/commands/test/regression/gen-forms.js.map +1 -0
  82. package/dist/commands/test/regression/index.d.ts +7 -0
  83. package/dist/commands/test/regression/index.d.ts.map +1 -0
  84. package/dist/commands/test/regression/index.js +33 -0
  85. package/dist/commands/test/regression/index.js.map +1 -0
  86. package/dist/commands/test/regression/init.d.ts +21 -0
  87. package/dist/commands/test/regression/init.d.ts.map +1 -0
  88. package/dist/commands/test/regression/init.js +111 -0
  89. package/dist/commands/test/regression/init.js.map +1 -0
  90. package/dist/commands/test/regression/remote.d.ts +23 -0
  91. package/dist/commands/test/regression/remote.d.ts.map +1 -0
  92. package/dist/commands/test/regression/remote.js +140 -0
  93. package/dist/commands/test/regression/remote.js.map +1 -0
  94. package/dist/commands/test/regression/up.d.ts +21 -0
  95. package/dist/commands/test/regression/up.d.ts.map +1 -0
  96. package/dist/commands/test/regression/up.js +111 -0
  97. package/dist/commands/test/regression/up.js.map +1 -0
  98. package/dist/commands/test/run.d.ts +1 -0
  99. package/dist/commands/test/run.d.ts.map +1 -1
  100. package/dist/commands/test/run.js +6 -0
  101. package/dist/commands/test/run.js.map +1 -1
  102. package/dist/commands/test/suite.d.ts +5 -0
  103. package/dist/commands/test/suite.d.ts.map +1 -1
  104. package/dist/commands/test/suite.js +27 -0
  105. package/dist/commands/test/suite.js.map +1 -1
  106. package/dist/commands/translate-sql/index.d.ts.map +1 -1
  107. package/dist/commands/translate-sql/index.js +3 -2
  108. package/dist/commands/translate-sql/index.js.map +1 -1
  109. package/dist/init-templates/bring-your-own-app/README.md +74 -0
  110. package/dist/init-templates/bring-your-own-app/byo-metadata/.mj-sync.json +10 -0
  111. package/dist/init-templates/bring-your-own-app/byo-metadata/test-suites/.byo-suite.json +51 -0
  112. package/dist/init-templates/bring-your-own-app/byo-metadata/test-suites/.mj-sync.json +12 -0
  113. package/dist/init-templates/bring-your-own-app/byo-metadata/tests/.T01-counter-increment.json +63 -0
  114. package/dist/init-templates/bring-your-own-app/byo-metadata/tests/.T02-contact-form-submit.json +63 -0
  115. package/dist/init-templates/bring-your-own-app/byo-metadata/tests/.mj-sync.json +12 -0
  116. package/dist/init-templates/bring-your-own-app/docker-compose.app.yml +76 -0
  117. package/dist/init-templates/bring-your-own-app/target.json +23 -0
  118. package/dist/init-templates/generic-web/README.md +115 -0
  119. package/dist/init-templates/generic-web/metadata/.mj-sync.json +10 -0
  120. package/dist/init-templates/generic-web/metadata/test-suites/.generic-web-suite.json +48 -0
  121. package/dist/init-templates/generic-web/metadata/test-suites/.mj-sync.json +12 -0
  122. package/dist/init-templates/generic-web/metadata/tests/.GW01-home-loads.json +74 -0
  123. package/dist/init-templates/generic-web/metadata/tests/.GW02-search-array-map.json +82 -0
  124. package/dist/init-templates/generic-web/metadata/tests/.mj-sync.json +12 -0
  125. package/dist/init-templates/generic-web/oracles/mdn-oracles.cjs +121 -0
  126. package/dist/init-templates/generic-web/target.json +25 -0
  127. package/dist/init-templates/github-actions/README.md +26 -0
  128. package/dist/init-templates/github-actions/regression.yml +52 -0
  129. package/dist/init-templates/remote-mj/README.md +95 -0
  130. package/dist/init-templates/remote-mj/target.json +22 -0
  131. package/dist/init-templates/static-file-server/Dockerfile +23 -0
  132. package/dist/init-templates/static-file-server/README.md +88 -0
  133. package/dist/init-templates/static-file-server/docker-compose.app.yml +44 -0
  134. package/dist/init-templates/static-file-server/metadata/.mj-sync.json +10 -0
  135. package/dist/init-templates/static-file-server/metadata/test-suites/.mj-sync.json +12 -0
  136. package/dist/init-templates/static-file-server/metadata/test-suites/.static-server-suite.json +27 -0
  137. package/dist/init-templates/static-file-server/metadata/tests/.SS01-home-loads.json +45 -0
  138. package/dist/init-templates/static-file-server/metadata/tests/.SS02-navigate-about.json +45 -0
  139. package/dist/init-templates/static-file-server/metadata/tests/.mj-sync.json +12 -0
  140. package/dist/init-templates/static-file-server/public/about.html +12 -0
  141. package/dist/init-templates/static-file-server/public/index.html +27 -0
  142. package/dist/init-templates/static-file-server/target.json +16 -0
  143. package/dist/lib/regression/docker-helpers.d.ts +98 -0
  144. package/dist/lib/regression/docker-helpers.d.ts.map +1 -0
  145. package/dist/lib/regression/docker-helpers.js +184 -0
  146. package/dist/lib/regression/docker-helpers.js.map +1 -0
  147. package/oclif.manifest.json +1356 -509
  148. package/package.json +22 -17
  149. package/regression-compose/docker-compose.bacpac-standalone.yml +109 -0
  150. package/regression-compose/docker-compose.standalone.yml +50 -0
@@ -0,0 +1,286 @@
1
+ /**
2
+ * Shared types for the baseline migration builder + comparator.
3
+ *
4
+ * A SchemaSnapshot is the result of introspecting a live database. It is
5
+ * dialect-agnostic in shape (the same shape comes back from MSSQL or PG),
6
+ * but every field is stored verbatim from the source system. Equality is
7
+ * decided structurally by the comparator.
8
+ */
9
+ export type Dialect = 'mssql' | 'postgres';
10
+ /** Top-level snapshot of an introspected database. */
11
+ export interface SchemaSnapshot {
12
+ dialect: Dialect;
13
+ schemas: SchemaDef[];
14
+ tables: TableDef[];
15
+ views: ViewDef[];
16
+ procedures: RoutineDef[];
17
+ functions: RoutineDef[];
18
+ triggers: TriggerDef[];
19
+ sequences: SequenceDef[];
20
+ /** User-defined types (table types primarily; scalar/CLR are future work). */
21
+ userDefinedTypes: UserDefinedTypeDef[];
22
+ /** sp_addextendedproperty entries (descriptions etc.) on schemas/tables/columns/views/routines. */
23
+ extendedProperties: ExtendedPropertyDef[];
24
+ /** Non-system database principals (users + custom roles). */
25
+ principals: DatabasePrincipalDef[];
26
+ /** Non-system role memberships (ALTER ROLE ... ADD MEMBER). */
27
+ roleMemberships: RoleMembershipDef[];
28
+ /** Object/schema/database/type permission grants (no DENY/REVOKE captured by default). */
29
+ permissions: PermissionDef[];
30
+ }
31
+ export interface SchemaDef {
32
+ name: string;
33
+ }
34
+ export interface TableDef {
35
+ schema: string;
36
+ name: string;
37
+ columns: ColumnDef[];
38
+ primaryKey?: PrimaryKeyDef;
39
+ uniqueConstraints: UniqueConstraintDef[];
40
+ indexes: IndexDef[];
41
+ foreignKeys: ForeignKeyDef[];
42
+ checks: CheckConstraintDef[];
43
+ hasIdentity: boolean;
44
+ }
45
+ export interface ColumnDef {
46
+ name: string;
47
+ ordinal: number;
48
+ dataType: string;
49
+ isNullable: boolean;
50
+ isIdentity: boolean;
51
+ isComputed: boolean;
52
+ /** When `isComputed`, the body of the AS (...) expression. */
53
+ computedExpression?: string;
54
+ /** When `isComputed`, whether the value is PERSISTED. */
55
+ isComputedPersisted?: boolean;
56
+ /** DEFAULT expression text (already wrapped in parens by sys.default_constraints.definition). */
57
+ defaultExpression?: string;
58
+ /** Original `sys.default_constraints.name`. Needed so the new DB's DF_* constraints match the source byte-for-byte. */
59
+ defaultConstraintName?: string;
60
+ collation?: string;
61
+ }
62
+ export interface PrimaryKeyDef {
63
+ name: string;
64
+ columns: string[];
65
+ clustered: boolean;
66
+ }
67
+ export interface UniqueConstraintDef {
68
+ name: string;
69
+ columns: string[];
70
+ clustered: boolean;
71
+ }
72
+ export interface IndexDef {
73
+ name: string;
74
+ columns: string[];
75
+ includes: string[];
76
+ isUnique: boolean;
77
+ isClustered: boolean;
78
+ filter?: string;
79
+ }
80
+ export interface ForeignKeyDef {
81
+ name: string;
82
+ columns: string[];
83
+ referencedSchema: string;
84
+ referencedTable: string;
85
+ referencedColumns: string[];
86
+ onDelete: 'NO_ACTION' | 'CASCADE' | 'SET_NULL' | 'SET_DEFAULT';
87
+ onUpdate: 'NO_ACTION' | 'CASCADE' | 'SET_NULL' | 'SET_DEFAULT';
88
+ }
89
+ export interface CheckConstraintDef {
90
+ name: string;
91
+ expression: string;
92
+ }
93
+ export interface ViewDef {
94
+ schema: string;
95
+ name: string;
96
+ definition: string;
97
+ }
98
+ export interface RoutineDef {
99
+ schema: string;
100
+ name: string;
101
+ definition: string;
102
+ kind: 'procedure' | 'function';
103
+ }
104
+ export interface TriggerDef {
105
+ schema: string;
106
+ name: string;
107
+ table: string;
108
+ definition: string;
109
+ }
110
+ export interface SequenceDef {
111
+ schema: string;
112
+ name: string;
113
+ startValue: string;
114
+ increment: string;
115
+ minValue?: string;
116
+ maxValue?: string;
117
+ cycle: boolean;
118
+ currentValue?: string;
119
+ }
120
+ /** A user-defined TYPE (currently only table types; scalar/CLR are future work). */
121
+ export interface UserDefinedTypeDef {
122
+ schema: string;
123
+ name: string;
124
+ kind: 'table';
125
+ isMemoryOptimized: boolean;
126
+ columns: UserDefinedTypeColumnDef[];
127
+ /** Inline primary key, if any. CREATE TYPE AS TABLE supports a PK clause. */
128
+ primaryKey?: PrimaryKeyDef;
129
+ }
130
+ /** Columns inside a CREATE TYPE AS TABLE definition. Subset of ColumnDef (no identity/computed/FK). */
131
+ export interface UserDefinedTypeColumnDef {
132
+ name: string;
133
+ ordinal: number;
134
+ dataType: string;
135
+ isNullable: boolean;
136
+ collation?: string;
137
+ }
138
+ /**
139
+ * A non-system database principal — a SQL user (mapped or contained) or a
140
+ * custom database role. Fixed roles (db_owner, db_datareader, etc.) and
141
+ * built-in users (dbo, guest, public, sys) are filtered out at introspection
142
+ * time; the baseline never re-creates those.
143
+ */
144
+ export interface DatabasePrincipalDef {
145
+ name: string;
146
+ kind: 'sql_user' | 'database_role' | 'windows_user' | 'application_role' | 'aad_user' | 'aad_group';
147
+ /** Owner principal name (e.g. `db_securityadmin` for MJ's cdp_* roles). Undefined falls back to the current user (typically `dbo`). */
148
+ owner?: string;
149
+ /** Default schema for users. Roles don't have one. */
150
+ defaultSchema?: string;
151
+ }
152
+ /** A row in `sys.database_role_members`. Both names refer to principals (user or role). */
153
+ export interface RoleMembershipDef {
154
+ role: string;
155
+ member: string;
156
+ }
157
+ /** State of a permission row in `sys.database_permissions`. */
158
+ export type PermissionState = 'GRANT' | 'GRANT_WITH_GRANT_OPTION' | 'DENY' | 'REVOKE';
159
+ /**
160
+ * A `GRANT`/`DENY` entry. MJ's CodeGen emits per-object grants for every view
161
+ * and stored procedure (e.g. `GRANT EXECUTE ON [__mj].[spCreateAIAgent] TO [cdp_Developer]`).
162
+ * Without these in the baseline, downstream V-files that GRANT to roles fail because
163
+ * the grantee is missing AND/OR the migration sequence drifts.
164
+ */
165
+ export interface PermissionDef {
166
+ grantee: string;
167
+ state: PermissionState;
168
+ permission: string;
169
+ targetClass: 'database' | 'schema' | 'object' | 'type';
170
+ targetSchema?: string;
171
+ targetObject?: string;
172
+ targetType?: string;
173
+ targetColumn?: string;
174
+ }
175
+ /**
176
+ * An `sp_addextendedproperty` entry. MJ uses these heavily for MS_Description
177
+ * on tables, columns, views, procs, and functions. Skipping them produces a
178
+ * silent DB difference that CodeGen and tools depend on.
179
+ */
180
+ export interface ExtendedPropertyDef {
181
+ /** Property name, e.g. 'MS_Description'. Case is preserved as stored. */
182
+ name: string;
183
+ /** Property value, always serialized as NVARCHAR. */
184
+ value: string;
185
+ /** level0 is always SCHEMA in MJ. Stored separately so we can emit the canonical 3-tier call. */
186
+ schemaName: string;
187
+ /** TABLE | VIEW | PROCEDURE | FUNCTION | TYPE | SEQUENCE | TRIGGER | null (for schema-level properties). */
188
+ level1Type?: string;
189
+ level1Name?: string;
190
+ /** COLUMN | PARAMETER | TRIGGER | INDEX | null. */
191
+ level2Type?: string;
192
+ level2Name?: string;
193
+ }
194
+ /** Per-table data dump (every row, ordered deterministically). */
195
+ export interface TableDataDump {
196
+ schema: string;
197
+ table: string;
198
+ /** Column order matches the INSERT column list. */
199
+ columns: string[];
200
+ /** Each row is an array of values matching `columns`. Null = JS null. */
201
+ rows: unknown[][];
202
+ /** Set when the dump was truncated due to a hard limit. */
203
+ truncated?: boolean;
204
+ rowCount: number;
205
+ }
206
+ /** Output of a full diff between two snapshots (and optional row data). */
207
+ export interface DiffReport {
208
+ generatedAt: string;
209
+ leftLabel: string;
210
+ rightLabel: string;
211
+ rowCompareMode: RowCompareMode;
212
+ isClean: boolean;
213
+ objectDiffs: ObjectDiff[];
214
+ tableRowDiffs: TableRowDiff[];
215
+ summary: DiffSummary;
216
+ }
217
+ export interface DiffSummary {
218
+ schemasChecked: number;
219
+ tablesChecked: number;
220
+ viewsChecked: number;
221
+ proceduresChecked: number;
222
+ functionsChecked: number;
223
+ triggersChecked: number;
224
+ sequencesChecked: number;
225
+ userDefinedTypesChecked: number;
226
+ extendedPropertiesChecked: number;
227
+ principalsChecked: number;
228
+ roleMembershipsChecked: number;
229
+ permissionsChecked: number;
230
+ objectsWithDiffs: number;
231
+ tablesWithRowDiffs: number;
232
+ totalRowDiffs: number;
233
+ }
234
+ export type RowCompareMode = 'full' | 'hash' | 'counts' | 'none';
235
+ export type RowHashAlgo = 'sha256' | 'md5' | 'checksum_agg';
236
+ export type ObjectKind = 'schema' | 'table' | 'column' | 'primaryKey' | 'uniqueConstraint' | 'index' | 'foreignKey' | 'check' | 'view' | 'procedure' | 'function' | 'trigger' | 'sequence' | 'userDefinedType' | 'extendedProperty' | 'principal' | 'roleMembership' | 'permission';
237
+ export type DiffKind = 'missing-on-left' | 'missing-on-right' | 'changed';
238
+ export interface ObjectDiff {
239
+ kind: ObjectKind;
240
+ diffKind: DiffKind;
241
+ qualifiedName: string;
242
+ /** Free-form details: which fields differ, with left/right values. */
243
+ details?: string;
244
+ leftValue?: unknown;
245
+ rightValue?: unknown;
246
+ }
247
+ export interface TableRowDiff {
248
+ schema: string;
249
+ table: string;
250
+ leftRowCount: number;
251
+ rightRowCount: number;
252
+ /** First N (default 100) row mismatches captured during full mode. */
253
+ sampleDiffs: RowDiff[];
254
+ /** True if there are more diffs than `sampleDiffs` shows. */
255
+ truncated: boolean;
256
+ /** Total mismatches counted (may exceed sampleDiffs.length). */
257
+ diffCount: number;
258
+ }
259
+ export interface RowDiff {
260
+ diffKind: DiffKind;
261
+ /** Stringified key (PK or whole-row hash) used for matching. */
262
+ key: string;
263
+ /** Per-column diffs in 'changed' rows only. */
264
+ columnDiffs?: ColumnValueDiff[];
265
+ }
266
+ export interface ColumnValueDiff {
267
+ column: string;
268
+ leftValue: unknown;
269
+ rightValue: unknown;
270
+ }
271
+ /** Build options passed to the emitter. */
272
+ export interface BaselineEmitOptions {
273
+ baselineVersion: string;
274
+ description: string;
275
+ generatedAtUtc: Date;
276
+ includeData: boolean;
277
+ excludedDataTables: Set<string>;
278
+ batchSize: number;
279
+ }
280
+ export interface BaselineCompareOptions {
281
+ rowCompareMode: RowCompareMode;
282
+ rowHashAlgo: RowHashAlgo;
283
+ ignorePattern?: RegExp;
284
+ rowDiffSampleLimit: number;
285
+ }
286
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/baseline/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Shared types for the baseline migration builder + comparator.
3
+ *
4
+ * A SchemaSnapshot is the result of introspecting a live database. It is
5
+ * dialect-agnostic in shape (the same shape comes back from MSSQL or PG),
6
+ * but every field is stored verbatim from the source system. Equality is
7
+ * decided structurally by the comparator.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/baseline/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Canonical formatting helpers used by the emitter and comparator.
3
+ *
4
+ * Determinism is the contract: identical input must produce byte-identical
5
+ * output, regardless of host OS, locale, or run order.
6
+ */
7
+ /** Lower-case schema-qualified name used for sort keys and sets. */
8
+ export declare function qname(schema: string, name: string): string;
9
+ /** Quote a T-SQL identifier with brackets, escaping any embedded `]`. */
10
+ export declare function quoteIdent(name: string): string;
11
+ /** Quote a T-SQL string literal, escaping single quotes. */
12
+ export declare function quoteString(value: string): string;
13
+ /** Stable sort by a key extractor; preserves input order for ties. */
14
+ export declare function stableSortBy<T>(items: readonly T[], key: (item: T) => string): T[];
15
+ /** Cross-platform line endings: emit LF only. Caller normalizes if needed. */
16
+ export declare const NL = "\n";
17
+ /**
18
+ * Tables that must never appear in the emitted baseline — they belong to the
19
+ * migration tool itself and get created automatically before the baseline runs.
20
+ * Match by table name only (schema-independent) because Skyway can be configured
21
+ * to put `flyway_schema_history` in any schema (MJ uses `__mj`, default is `dbo`).
22
+ */
23
+ export declare const EXCLUDED_TABLE_NAMES: ReadonlySet<string>;
24
+ /** Returns true if a table (by bare name) is one we never emit in a baseline. */
25
+ export declare function isExcludedTable(name: string): boolean;
26
+ /** Canonical ISO-8601 UTC stamp without milliseconds: 2026-05-02T19:47:00Z. */
27
+ export declare function isoUtcSeconds(date: Date): string;
28
+ /** Filename timestamp: YYYYMMDDHHMM in UTC. */
29
+ export declare function fileStamp(date: Date): string;
30
+ /** Build the canonical filename for a baseline migration. */
31
+ export declare function baselineFilename(opts: {
32
+ generatedAtUtc: Date;
33
+ baselineVersion: string;
34
+ }): string;
35
+ /** Inverse of {@link fileStamp}: parses a YYYYMMDDHHMM string into a UTC Date. */
36
+ export declare function parseFileStamp(stamp: string): Date;
37
+ /** Return a new Date offset by N minutes (negative for past). */
38
+ export declare function addMinutes(date: Date, minutes: number): Date;
39
+ /**
40
+ * Parse a Skyway/Flyway migration filename into its parts. Returns null if the
41
+ * filename doesn't match the expected `[VB]<timestamp>__v<Major>.<Minor>...` shape.
42
+ *
43
+ * Handles both styles found in the `migrations/v{N}/` directories:
44
+ * - `V202602131500__v5.0.x__Entity_Name_Normalization.sql` (with `.x` patch)
45
+ * - `V202602170015__v5.1__Regenerate_Delete_Stored_Procs.sql` (no patch)
46
+ * - `B202602151200__v5.0__Baseline.sql` (baseline marker)
47
+ */
48
+ export interface ParsedMigrationFilename {
49
+ kind: 'V' | 'B';
50
+ timestamp: string;
51
+ major: number;
52
+ minor: number;
53
+ majorMinor: string;
54
+ filename: string;
55
+ }
56
+ export declare function parseMigrationFilename(filename: string): ParsedMigrationFilename | null;
57
+ /**
58
+ * Scan a migrations source directory and return the latest V-file by timestamp.
59
+ * Files that don't match the expected shape are silently ignored.
60
+ *
61
+ * Used by within-major rebaseline to derive the new baseline's version + timestamp
62
+ * from the head of the existing V-stack.
63
+ */
64
+ export declare function findLatestVersionedMigration(sourceDir: string): ParsedMigrationFilename | null;
65
+ /** Same as {@link findLatestVersionedMigration} but for `B`-prefixed baseline files. */
66
+ export declare function findLatestBaselineMigration(sourceDir: string): ParsedMigrationFilename | null;
67
+ /**
68
+ * Walk up from `cwd` looking for a `migrations/` directory, then return the path
69
+ * to the highest-numbered `vN/` subdirectory inside it. Returns null if nothing
70
+ * suitable is found.
71
+ *
72
+ * Stops walking at the filesystem root. Used so the CLI can auto-locate the
73
+ * source dir for within-major rebaseline without forcing the caller to pass `--source-dir`.
74
+ */
75
+ export declare function discoverMigrationsSourceDir(cwd: string): string | null;
76
+ /**
77
+ * Compute the canonical generated-at timestamp for a within-major rebaseline.
78
+ * The new baseline's filename timestamp is exactly 1 minute after the latest
79
+ * V-file's timestamp — guaranteeing the new B-file sorts after the V-stack it
80
+ * succeeds, while remaining deterministic across re-runs against the same input.
81
+ */
82
+ export declare function computeAutoBaselineStamp(latestVTimestamp: string): {
83
+ generatedAtUtc: Date;
84
+ fileStamp: string;
85
+ };
86
+ /**
87
+ * Format a JS value as a T-SQL literal. Used by the data dumper.
88
+ * Returns `NULL` for null/undefined, otherwise a typed literal.
89
+ */
90
+ export declare function formatTsqlValue(value: unknown): string;
91
+ /** Strict equality used by the comparator for column values. */
92
+ export declare function deepValueEqual(a: unknown, b: unknown): boolean;
93
+ /** Truncate a string with an ellipsis for diff output. */
94
+ export declare function ellipsize(value: string, max?: number): string;
95
+ /**
96
+ * Topologically sort a list of SQL routines (views/functions/procs/triggers)
97
+ * by inferred dependencies. A routine A depends on B if A's `definition` text
98
+ * mentions B's name (case-insensitive, schema-qualified or bare with word
99
+ * boundaries). Stable for equal items; sorts cycles by qname so the result is
100
+ * still deterministic.
101
+ *
102
+ * Reference extraction is heuristic — comments and string literals are not
103
+ * stripped — but false positives only add edges that don't hurt correctness.
104
+ * MSSQL `CREATE VIEW`/`CREATE FUNCTION` reject forward references at create
105
+ * time, so without this sort we hit `Invalid object name` errors on apply.
106
+ */
107
+ export declare function topoSortRoutinesByDefinition<T extends {
108
+ name: string;
109
+ schema: string;
110
+ definition: string;
111
+ }>(items: readonly T[]): T[];
112
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/baseline/util.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,oEAAoE;AACpE,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAAG,CAAC,EAAE,CASlF;AAED,8EAA8E;AAC9E,eAAO,MAAM,EAAE,OAAO,CAAC;AAEvB;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAAsC,CAAC;AAE5F,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAEhD;AAED,+CAA+C;AAC/C,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAS5C;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,cAAc,EAAE,IAAI,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEhG;AAED,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAUlD;AAED,iEAAiE;AACjE,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE5D;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,GAAG,GAAG,GAAG,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,uBAAuB,GAAG,IAAI,CAWvF;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,uBAAuB,GAAG,IAAI,CAa9F;AAED,wFAAwF;AACxF,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,uBAAuB,GAAG,IAAI,CAa7F;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmBtE;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,gBAAgB,EAAE,MAAM,GAAG;IAClE,cAAc,EAAE,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB,CAIA;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CA4BtD;AAED,gEAAgE;AAChE,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAwB9D;AAED,0DAA0D;AAC1D,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAK,GAAG,MAAM,CAEzD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,4BAA4B,CAC1C,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EAC9D,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAqD1B"}