@chkit/core 0.1.0-beta.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 (49) hide show
  1. package/dist/canonical.d.ts +6 -0
  2. package/dist/canonical.d.ts.map +1 -0
  3. package/dist/canonical.js +133 -0
  4. package/dist/canonical.js.map +1 -0
  5. package/dist/diff-primitives.d.ts +28 -0
  6. package/dist/diff-primitives.d.ts.map +1 -0
  7. package/dist/diff-primitives.js +52 -0
  8. package/dist/diff-primitives.js.map +1 -0
  9. package/dist/index.d.ts +9 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +9 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/key-clause.d.ts +3 -0
  14. package/dist/key-clause.d.ts.map +1 -0
  15. package/dist/key-clause.js +47 -0
  16. package/dist/key-clause.js.map +1 -0
  17. package/dist/model-types.d.ts +161 -0
  18. package/dist/model-types.d.ts.map +1 -0
  19. package/dist/model-types.js +2 -0
  20. package/dist/model-types.js.map +1 -0
  21. package/dist/model.d.ts +15 -0
  22. package/dist/model.d.ts.map +1 -0
  23. package/dist/model.js +61 -0
  24. package/dist/model.js.map +1 -0
  25. package/dist/planner.d.ts +3 -0
  26. package/dist/planner.d.ts.map +1 -0
  27. package/dist/planner.js +376 -0
  28. package/dist/planner.js.map +1 -0
  29. package/dist/schema-loader.d.ts +6 -0
  30. package/dist/schema-loader.d.ts.map +1 -0
  31. package/dist/schema-loader.js +21 -0
  32. package/dist/schema-loader.js.map +1 -0
  33. package/dist/snapshot.d.ts +3 -0
  34. package/dist/snapshot.d.ts.map +1 -0
  35. package/dist/snapshot.js +9 -0
  36. package/dist/snapshot.js.map +1 -0
  37. package/dist/sql-normalizer.d.ts +2 -0
  38. package/dist/sql-normalizer.d.ts.map +1 -0
  39. package/dist/sql-normalizer.js +4 -0
  40. package/dist/sql-normalizer.js.map +1 -0
  41. package/dist/sql.d.ts +16 -0
  42. package/dist/sql.d.ts.map +1 -0
  43. package/dist/sql.js +95 -0
  44. package/dist/sql.js.map +1 -0
  45. package/dist/validate.d.ts +4 -0
  46. package/dist/validate.d.ts.map +1 -0
  47. package/dist/validate.js +72 -0
  48. package/dist/validate.js.map +1 -0
  49. package/package.json +27 -0
@@ -0,0 +1,6 @@
1
+ import type { SchemaDefinition } from './model.js';
2
+ export declare function canonicalizeDefinition(def: SchemaDefinition): SchemaDefinition;
3
+ export declare function definitionKey(def: SchemaDefinition): string;
4
+ export declare function canonicalizeDefinitions(definitions: SchemaDefinition[]): SchemaDefinition[];
5
+ export declare function collectDefinitionsFromModule(mod: Record<string, unknown>): SchemaDefinition[];
6
+ //# sourceMappingURL=canonical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,gBAAgB,EAIjB,MAAM,YAAY,CAAA;AAmGnB,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,GAAG,gBAAgB,CAI9E;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAE3D;AAED,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAc3F;AAED,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAAE,CAiB7F"}
@@ -0,0 +1,133 @@
1
+ import { normalizeKeyColumns } from './key-clause.js';
2
+ import { isSchemaDefinition } from './model.js';
3
+ import { normalizeSQLFragment } from './sql-normalizer.js';
4
+ function sortByName(items) {
5
+ return [...items].sort((a, b) => a.name.localeCompare(b.name));
6
+ }
7
+ function sortKind(kind) {
8
+ if (kind === 'table')
9
+ return 0;
10
+ if (kind === 'view')
11
+ return 1;
12
+ return 2;
13
+ }
14
+ function canonicalizeColumn(column) {
15
+ return {
16
+ ...column,
17
+ name: column.name.trim(),
18
+ renamedFrom: column.renamedFrom?.trim(),
19
+ type: typeof column.type === 'string' ? column.type.trim() : column.type,
20
+ comment: column.comment?.trim(),
21
+ };
22
+ }
23
+ function canonicalizeIndex(index) {
24
+ return {
25
+ ...index,
26
+ expression: normalizeSQLFragment(index.expression),
27
+ };
28
+ }
29
+ function canonicalizeProjection(projection) {
30
+ return {
31
+ ...projection,
32
+ query: normalizeSQLFragment(projection.query),
33
+ };
34
+ }
35
+ function canonicalizeTable(def) {
36
+ const settings = def.settings
37
+ ? Object.fromEntries(Object.entries(def.settings).sort(([a], [b]) => a.localeCompare(b)))
38
+ : undefined;
39
+ const indexes = def.indexes ? sortByName(def.indexes).map(canonicalizeIndex) : undefined;
40
+ const projections = def.projections
41
+ ? sortByName(def.projections).map(canonicalizeProjection)
42
+ : undefined;
43
+ return {
44
+ ...def,
45
+ database: def.database.trim(),
46
+ name: def.name.trim(),
47
+ renamedFrom: def.renamedFrom
48
+ ? {
49
+ database: def.renamedFrom.database?.trim(),
50
+ name: def.renamedFrom.name.trim(),
51
+ }
52
+ : undefined,
53
+ engine: def.engine.trim(),
54
+ columns: def.columns.map(canonicalizeColumn),
55
+ primaryKey: normalizeKeyColumns(def.primaryKey),
56
+ orderBy: normalizeKeyColumns(def.orderBy),
57
+ uniqueKey: def.uniqueKey ? normalizeKeyColumns(def.uniqueKey) : undefined,
58
+ partitionBy: def.partitionBy ? normalizeSQLFragment(def.partitionBy) : undefined,
59
+ ttl: def.ttl ? normalizeSQLFragment(def.ttl) : undefined,
60
+ settings,
61
+ indexes,
62
+ projections,
63
+ comment: def.comment?.trim(),
64
+ };
65
+ }
66
+ function canonicalizeView(def) {
67
+ return {
68
+ ...def,
69
+ database: def.database.trim(),
70
+ name: def.name.trim(),
71
+ as: normalizeSQLFragment(def.as),
72
+ comment: def.comment?.trim(),
73
+ };
74
+ }
75
+ function canonicalizeMaterializedView(def) {
76
+ return {
77
+ ...def,
78
+ database: def.database.trim(),
79
+ name: def.name.trim(),
80
+ to: {
81
+ database: def.to.database.trim(),
82
+ name: def.to.name.trim(),
83
+ },
84
+ as: normalizeSQLFragment(def.as),
85
+ comment: def.comment?.trim(),
86
+ };
87
+ }
88
+ export function canonicalizeDefinition(def) {
89
+ if (def.kind === 'table')
90
+ return canonicalizeTable(def);
91
+ if (def.kind === 'view')
92
+ return canonicalizeView(def);
93
+ return canonicalizeMaterializedView(def);
94
+ }
95
+ export function definitionKey(def) {
96
+ return `${def.kind}:${def.database}.${def.name}`;
97
+ }
98
+ export function canonicalizeDefinitions(definitions) {
99
+ const dedup = new Map();
100
+ for (const def of definitions) {
101
+ const normalized = canonicalizeDefinition(def);
102
+ dedup.set(definitionKey(normalized), normalized);
103
+ }
104
+ return [...dedup.values()].sort((a, b) => {
105
+ const kindOrder = sortKind(a.kind) - sortKind(b.kind);
106
+ if (kindOrder !== 0)
107
+ return kindOrder;
108
+ const dbOrder = a.database.localeCompare(b.database);
109
+ if (dbOrder !== 0)
110
+ return dbOrder;
111
+ return a.name.localeCompare(b.name);
112
+ });
113
+ }
114
+ export function collectDefinitionsFromModule(mod) {
115
+ const out = [];
116
+ const walk = (value) => {
117
+ if (!value)
118
+ return;
119
+ if (Array.isArray(value)) {
120
+ for (const entry of value)
121
+ walk(entry);
122
+ return;
123
+ }
124
+ if (isSchemaDefinition(value)) {
125
+ out.push(value);
126
+ return;
127
+ }
128
+ };
129
+ for (const value of Object.values(mod))
130
+ walk(value);
131
+ return canonicalizeDefinitions(out);
132
+ }
133
+ //# sourceMappingURL=canonical.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.js","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface NamedDiffChange<T> {
2
+ name: string;
3
+ oldItem: T;
4
+ newItem: T;
5
+ }
6
+ export interface NamedDiffResult<T> {
7
+ added: T[];
8
+ removed: T[];
9
+ changed: NamedDiffChange<T>[];
10
+ }
11
+ export declare function diffByName<T>(oldItems: readonly T[], newItems: readonly T[], getName: (item: T) => string, equals: (left: T, right: T) => boolean): NamedDiffResult<T>;
12
+ export interface SettingDiffResult {
13
+ changes: Array<{
14
+ kind: 'modify';
15
+ key: string;
16
+ value: string | number | boolean;
17
+ } | {
18
+ kind: 'reset';
19
+ key: string;
20
+ }>;
21
+ }
22
+ export declare function diffSettings(oldSettings: Record<string, string | number | boolean>, newSettings: Record<string, string | number | boolean>): SettingDiffResult;
23
+ export interface ClauseComparison {
24
+ oldValue: string;
25
+ newValue: string;
26
+ }
27
+ export declare function diffClauses(comparisons: readonly ClauseComparison[]): boolean;
28
+ //# sourceMappingURL=diff-primitives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-primitives.d.ts","sourceRoot":"","sources":["../src/diff-primitives.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,CAAC,CAAA;IACV,OAAO,EAAE,CAAC,CAAA;CACX;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,KAAK,EAAE,CAAC,EAAE,CAAA;IACV,OAAO,EAAE,CAAC,EAAE,CAAA;IACZ,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAA;CAC9B;AAED,wBAAgB,UAAU,CAAC,CAAC,EAC1B,QAAQ,EAAE,SAAS,CAAC,EAAE,EACtB,QAAQ,EAAE,SAAS,CAAC,EAAE,EACtB,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,EAC5B,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,OAAO,GACrC,eAAe,CAAC,CAAC,CAAC,CA+BpB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,KAAK,CACV;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;KAAE,GACjE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CACjC,CAAA;CACF;AAED,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,EACtD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GACrD,iBAAiB,CAmBnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,GAAG,OAAO,CAE7E"}
@@ -0,0 +1,52 @@
1
+ export function diffByName(oldItems, newItems, getName, equals) {
2
+ const oldByName = new Map(oldItems.map((item) => [getName(item), item]));
3
+ const newNames = new Set(newItems.map((item) => getName(item)));
4
+ const added = [];
5
+ const changed = [];
6
+ const removed = [];
7
+ for (const newItem of newItems) {
8
+ const name = getName(newItem);
9
+ const oldItem = oldByName.get(name);
10
+ if (!oldItem) {
11
+ added.push(newItem);
12
+ continue;
13
+ }
14
+ if (!equals(oldItem, newItem)) {
15
+ changed.push({ name, oldItem, newItem });
16
+ }
17
+ }
18
+ for (const oldItem of oldItems) {
19
+ const name = getName(oldItem);
20
+ if (!newNames.has(name)) {
21
+ removed.push(oldItem);
22
+ }
23
+ }
24
+ return {
25
+ added,
26
+ removed,
27
+ changed,
28
+ };
29
+ }
30
+ export function diffSettings(oldSettings, newSettings) {
31
+ const keys = [...new Set([...Object.keys(oldSettings), ...Object.keys(newSettings)])].sort();
32
+ const changes = [];
33
+ for (const key of keys) {
34
+ const hadValue = key in oldSettings;
35
+ const nextValue = newSettings[key];
36
+ if (nextValue === undefined) {
37
+ if (hadValue)
38
+ changes.push({ kind: 'reset', key });
39
+ continue;
40
+ }
41
+ if (!hadValue || oldSettings[key] !== nextValue) {
42
+ changes.push({ kind: 'modify', key, value: nextValue });
43
+ }
44
+ }
45
+ return {
46
+ changes,
47
+ };
48
+ }
49
+ export function diffClauses(comparisons) {
50
+ return comparisons.some((comparison) => comparison.oldValue !== comparison.newValue);
51
+ }
52
+ //# sourceMappingURL=diff-primitives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-primitives.js","sourceRoot":"","sources":["../src/diff-primitives.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,UAAU,CACxB,QAAsB,EACtB,QAAsB,EACtB,OAA4B,EAC5B,MAAsC;IAEtC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;IACxE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC/D,MAAM,KAAK,GAAQ,EAAE,CAAA;IACrB,MAAM,OAAO,GAAyB,EAAE,CAAA;IACxC,MAAM,OAAO,GAAQ,EAAE,CAAA;IAEvB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAC7B,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACnB,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK;QACL,OAAO;QACP,OAAO;KACR,CAAA;AACH,CAAC;AASD,MAAM,UAAU,YAAY,CAC1B,WAAsD,EACtD,WAAsD;IAEtD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAC5F,MAAM,OAAO,GAAiC,EAAE,CAAA;IAEhD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,GAAG,IAAI,WAAW,CAAA;QACnC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;QAClC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,QAAQ;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAA;YAClD,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;QACzD,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO;KACR,CAAA;AACH,CAAC;AAOD,MAAM,UAAU,WAAW,CAAC,WAAwC;IAClE,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,UAAU,CAAC,QAAQ,CAAC,CAAA;AACtF,CAAC"}
@@ -0,0 +1,9 @@
1
+ export * from './model.js';
2
+ export { canonicalizeDefinition, canonicalizeDefinitions, collectDefinitionsFromModule, } from './canonical.js';
3
+ export { planDiff } from './planner.js';
4
+ export { createSnapshot } from './snapshot.js';
5
+ export { loadSchemaDefinitions, type SchemaLoaderOptions } from './schema-loader.js';
6
+ export { normalizeSQLFragment } from './sql-normalizer.js';
7
+ export { toCreateSQL } from './sql.js';
8
+ export { assertValidDefinitions, validateDefinitions } from './validate.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,qBAAqB,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export * from './model.js';
2
+ export { canonicalizeDefinition, canonicalizeDefinitions, collectDefinitionsFromModule, } from './canonical.js';
3
+ export { planDiff } from './planner.js';
4
+ export { createSnapshot } from './snapshot.js';
5
+ export { loadSchemaDefinitions } from './schema-loader.js';
6
+ export { normalizeSQLFragment } from './sql-normalizer.js';
7
+ export { toCreateSQL } from './sql.js';
8
+ export { assertValidDefinitions, validateDefinitions } from './validate.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAE,qBAAqB,EAA4B,MAAM,oBAAoB,CAAA;AACpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,3 @@
1
+ export declare function splitTopLevelComma(input: string): string[];
2
+ export declare function normalizeKeyColumns(values: string[]): string[];
3
+ //# sourceMappingURL=key-clause.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-clause.d.ts","sourceRoot":"","sources":["../src/key-clause.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAgD1D;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAE9D"}
@@ -0,0 +1,47 @@
1
+ export function splitTopLevelComma(input) {
2
+ const out = [];
3
+ let current = '';
4
+ let depth = 0;
5
+ let quote = null;
6
+ for (let i = 0; i < input.length; i += 1) {
7
+ const char = input[i] ?? '';
8
+ const prev = i > 0 ? input[i - 1] : '';
9
+ if (quote) {
10
+ current += char;
11
+ if (char === quote && prev !== '\\')
12
+ quote = null;
13
+ continue;
14
+ }
15
+ if (char === "'" || char === '"' || char === '`') {
16
+ quote = char;
17
+ current += char;
18
+ continue;
19
+ }
20
+ if (char === '(') {
21
+ depth += 1;
22
+ current += char;
23
+ continue;
24
+ }
25
+ if (char === ')') {
26
+ depth = Math.max(0, depth - 1);
27
+ current += char;
28
+ continue;
29
+ }
30
+ if (char === ',' && depth === 0) {
31
+ const token = current.trim();
32
+ if (token.length > 0)
33
+ out.push(token);
34
+ current = '';
35
+ continue;
36
+ }
37
+ current += char;
38
+ }
39
+ const tail = current.trim();
40
+ if (tail.length > 0)
41
+ out.push(tail);
42
+ return out;
43
+ }
44
+ export function normalizeKeyColumns(values) {
45
+ return values.flatMap((value) => splitTopLevelComma(value.trim()));
46
+ }
47
+ //# sourceMappingURL=key-clause.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-clause.js","sourceRoot":"","sources":["../src/key-clause.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,IAAI,OAAO,GAAG,EAAE,CAAA;IAChB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,IAAI,KAAK,GAA2B,IAAI,CAAA;IAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC3B,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAEtC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,IAAI,IAAI,CAAA;YACf,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI;gBAAE,KAAK,GAAG,IAAI,CAAA;YACjD,SAAQ;QACV,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjD,KAAK,GAAG,IAAI,CAAA;YACZ,OAAO,IAAI,IAAI,CAAA;YACf,SAAQ;QACV,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,KAAK,IAAI,CAAC,CAAA;YACV,OAAO,IAAI,IAAI,CAAA;YACf,SAAQ;QACV,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;YAC9B,OAAO,IAAI,IAAI,CAAA;YACf,SAAQ;QACV,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;YAC5B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACrC,OAAO,GAAG,EAAE,CAAA;YACZ,SAAQ;QACV,CAAC;QAED,OAAO,IAAI,IAAI,CAAA;IACjB,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;IAC3B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEnC,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAgB;IAClD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;AACpE,CAAC"}
@@ -0,0 +1,161 @@
1
+ export type PrimitiveColumnType = 'String' | 'UInt8' | 'UInt16' | 'UInt32' | 'UInt64' | 'UInt128' | 'UInt256' | 'Int8' | 'Int16' | 'Int32' | 'Int64' | 'Int128' | 'Int256' | 'Float32' | 'Float64' | 'Bool' | 'Boolean' | 'Date' | 'DateTime' | 'DateTime64';
2
+ export interface ColumnDefinition {
3
+ name: string;
4
+ type: PrimitiveColumnType | string;
5
+ renamedFrom?: string;
6
+ nullable?: boolean;
7
+ default?: string | number | boolean;
8
+ comment?: string;
9
+ }
10
+ export interface SkipIndexDefinition {
11
+ name: string;
12
+ expression: string;
13
+ type: 'minmax' | 'set' | 'bloom_filter' | 'tokenbf_v1' | 'ngrambf_v1';
14
+ granularity: number;
15
+ }
16
+ export interface ProjectionDefinition {
17
+ name: string;
18
+ query: string;
19
+ }
20
+ export interface TableDefinition {
21
+ kind: 'table';
22
+ database: string;
23
+ name: string;
24
+ renamedFrom?: {
25
+ database?: string;
26
+ name: string;
27
+ };
28
+ columns: ColumnDefinition[];
29
+ engine: string;
30
+ primaryKey: string[];
31
+ orderBy: string[];
32
+ uniqueKey?: string[];
33
+ partitionBy?: string;
34
+ ttl?: string;
35
+ settings?: Record<string, string | number | boolean>;
36
+ indexes?: SkipIndexDefinition[];
37
+ projections?: ProjectionDefinition[];
38
+ comment?: string;
39
+ }
40
+ export interface ViewDefinition {
41
+ kind: 'view';
42
+ database: string;
43
+ name: string;
44
+ as: string;
45
+ comment?: string;
46
+ }
47
+ export interface MaterializedViewDefinition {
48
+ kind: 'materialized_view';
49
+ database: string;
50
+ name: string;
51
+ to: {
52
+ database: string;
53
+ name: string;
54
+ };
55
+ as: string;
56
+ comment?: string;
57
+ }
58
+ export type SchemaDefinition = TableDefinition | ViewDefinition | MaterializedViewDefinition;
59
+ export interface ChxCheckConfig {
60
+ failOnPending?: boolean;
61
+ failOnChecksumMismatch?: boolean;
62
+ failOnDrift?: boolean;
63
+ }
64
+ export interface ChxSafetyConfig {
65
+ allowDestructive?: boolean;
66
+ }
67
+ export interface ChxUserClickHouseConfig {
68
+ url: string;
69
+ username?: string;
70
+ password?: string;
71
+ database?: string;
72
+ secure?: boolean;
73
+ }
74
+ export interface ChxResolvedClickHouseConfig {
75
+ url: string;
76
+ username: string;
77
+ password: string;
78
+ database: string;
79
+ secure: boolean;
80
+ }
81
+ export interface ChxLegacyPluginRegistration {
82
+ resolve: string;
83
+ name?: string;
84
+ enabled?: boolean;
85
+ options?: Record<string, unknown>;
86
+ }
87
+ export interface ChxInlinePluginRegistration<TPlugin = unknown, TOptions extends object = Record<string, unknown>> {
88
+ plugin: TPlugin;
89
+ name?: string;
90
+ enabled?: boolean;
91
+ options?: TOptions;
92
+ }
93
+ export type ChxPluginRegistration = string | ChxLegacyPluginRegistration | ChxInlinePluginRegistration;
94
+ export interface ChxUserConfig {
95
+ schema: string | string[];
96
+ outDir?: string;
97
+ migrationsDir?: string;
98
+ metaDir?: string;
99
+ plugins?: ChxPluginRegistration[];
100
+ check?: ChxCheckConfig;
101
+ safety?: ChxSafetyConfig;
102
+ clickhouse?: ChxUserClickHouseConfig;
103
+ }
104
+ export interface ChxResolvedConfig {
105
+ schema: string[];
106
+ outDir: string;
107
+ migrationsDir: string;
108
+ metaDir: string;
109
+ plugins: ChxPluginRegistration[];
110
+ check: Required<ChxCheckConfig>;
111
+ safety: Required<ChxSafetyConfig>;
112
+ clickhouse?: ChxResolvedClickHouseConfig;
113
+ }
114
+ export interface ChxConfigEnv {
115
+ command?: string;
116
+ mode?: string;
117
+ }
118
+ export type ChxConfigFn<T extends ChxUserConfig = ChxUserConfig> = (env: ChxConfigEnv) => T | Promise<T>;
119
+ export type ChxConfigInput<T extends ChxUserConfig = ChxUserConfig> = T | ChxConfigFn<T>;
120
+ export type ChxConfig = ChxUserConfig;
121
+ export type ResolvedChxConfig = ChxResolvedConfig;
122
+ export interface SnapshotV1 {
123
+ version: 1;
124
+ generatedAt: string;
125
+ definitions: SchemaDefinition[];
126
+ }
127
+ export type Snapshot = SnapshotV1;
128
+ export type RiskLevel = 'safe' | 'caution' | 'danger';
129
+ export type MigrationOperationType = 'create_database' | 'create_table' | 'drop_table' | 'create_view' | 'drop_view' | 'create_materialized_view' | 'drop_materialized_view' | 'alter_table_add_column' | 'alter_table_modify_column' | 'alter_table_drop_column' | 'alter_table_rename_column' | 'alter_table_rename_table' | 'alter_table_add_index' | 'alter_table_add_projection' | 'alter_table_modify_setting' | 'alter_table_drop_index' | 'alter_table_drop_projection' | 'alter_table_reset_setting' | 'alter_table_modify_ttl';
130
+ export interface MigrationOperation {
131
+ type: MigrationOperationType;
132
+ key: string;
133
+ risk: RiskLevel;
134
+ sql: string;
135
+ }
136
+ export interface ColumnRenameSuggestion {
137
+ kind: 'column';
138
+ database: string;
139
+ table: string;
140
+ from: string;
141
+ to: string;
142
+ confidence: 'high';
143
+ reason: string;
144
+ dropOperationKey: string;
145
+ addOperationKey: string;
146
+ confirmationSQL: string;
147
+ }
148
+ export interface MigrationPlan {
149
+ operations: MigrationOperation[];
150
+ riskSummary: Record<RiskLevel, number>;
151
+ renameSuggestions: ColumnRenameSuggestion[];
152
+ }
153
+ export type ValidationIssueCode = 'duplicate_object_name' | 'duplicate_column_name' | 'duplicate_index_name' | 'duplicate_projection_name' | 'primary_key_missing_column' | 'order_by_missing_column';
154
+ export interface ValidationIssue {
155
+ code: ValidationIssueCode;
156
+ kind: SchemaDefinition['kind'];
157
+ database: string;
158
+ name: string;
159
+ message: string;
160
+ }
161
+ //# sourceMappingURL=model-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-types.d.ts","sourceRoot":"","sources":["../src/model-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=model-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-types.js","sourceRoot":"","sources":["../src/model-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import type { ChxConfigFn, ChxResolvedConfig, ChxUserConfig, MaterializedViewDefinition, SchemaDefinition, TableDefinition, ValidationIssue, ViewDefinition } from './model-types.js';
2
+ export * from './model-types.js';
3
+ export declare class ChxValidationError extends Error {
4
+ readonly issues: ValidationIssue[];
5
+ constructor(issues: ValidationIssue[]);
6
+ }
7
+ export declare function defineConfig<T extends ChxUserConfig>(config: T): T;
8
+ export declare function defineConfig<T extends ChxUserConfig>(config: ChxConfigFn<T>): ChxConfigFn<T>;
9
+ export declare function resolveConfig(config: ChxUserConfig): ChxResolvedConfig;
10
+ export declare function table(input: Omit<TableDefinition, 'kind'>): TableDefinition;
11
+ export declare function view(input: Omit<ViewDefinition, 'kind'>): ViewDefinition;
12
+ export declare function materializedView(input: Omit<MaterializedViewDefinition, 'kind'>): MaterializedViewDefinition;
13
+ export declare function schema(...definitions: SchemaDefinition[]): SchemaDefinition[];
14
+ export declare function isSchemaDefinition(value: unknown): value is SchemaDefinition;
15
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EAEX,iBAAiB,EACjB,aAAa,EACb,0BAA0B,EAC1B,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,cAAc,EACf,MAAM,kBAAkB,CAAA;AAEzB,cAAc,kBAAkB,CAAA;AAEhC,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,CAAA;gBAEtB,MAAM,EAAE,eAAe,EAAE;CAOtC;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,aAAa,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAAA;AACnE,wBAAgB,YAAY,CAAC,CAAC,SAAS,aAAa,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;AAK7F,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,iBAAiB,CA6BtE;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,eAAe,CAE3E;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,GAAG,cAAc,CAExE;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,IAAI,CAAC,0BAA0B,EAAE,MAAM,CAAC,GAC9C,0BAA0B,CAE5B;AAED,wBAAgB,MAAM,CAAC,GAAG,WAAW,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAE7E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAI5E"}
package/dist/model.js ADDED
@@ -0,0 +1,61 @@
1
+ import { join } from 'node:path';
2
+ export * from './model-types.js';
3
+ export class ChxValidationError extends Error {
4
+ issues;
5
+ constructor(issues) {
6
+ super(`Schema validation failed with ${issues.length} issue${issues.length === 1 ? '' : 's'}`);
7
+ this.name = 'ChxValidationError';
8
+ this.issues = issues;
9
+ }
10
+ }
11
+ export function defineConfig(config) {
12
+ return config;
13
+ }
14
+ export function resolveConfig(config) {
15
+ const outDir = config.outDir ?? './chx';
16
+ const migrationsDir = config.migrationsDir ?? join(outDir, 'migrations');
17
+ const metaDir = config.metaDir ?? join(outDir, 'meta');
18
+ return {
19
+ schema: Array.isArray(config.schema) ? config.schema : [config.schema],
20
+ outDir,
21
+ migrationsDir,
22
+ metaDir,
23
+ plugins: config.plugins ?? [],
24
+ check: {
25
+ failOnPending: config.check?.failOnPending ?? true,
26
+ failOnChecksumMismatch: config.check?.failOnChecksumMismatch ?? true,
27
+ failOnDrift: config.check?.failOnDrift ?? true,
28
+ },
29
+ safety: {
30
+ allowDestructive: config.safety?.allowDestructive ?? false,
31
+ },
32
+ clickhouse: config.clickhouse
33
+ ? {
34
+ url: config.clickhouse.url,
35
+ username: config.clickhouse.username ?? 'default',
36
+ password: config.clickhouse.password ?? '',
37
+ database: config.clickhouse.database ?? 'default',
38
+ secure: config.clickhouse.secure ?? false,
39
+ }
40
+ : undefined,
41
+ };
42
+ }
43
+ export function table(input) {
44
+ return { ...input, kind: 'table' };
45
+ }
46
+ export function view(input) {
47
+ return { ...input, kind: 'view' };
48
+ }
49
+ export function materializedView(input) {
50
+ return { ...input, kind: 'materialized_view' };
51
+ }
52
+ export function schema(...definitions) {
53
+ return definitions;
54
+ }
55
+ export function isSchemaDefinition(value) {
56
+ if (!value || typeof value !== 'object')
57
+ return false;
58
+ const kind = value.kind;
59
+ return kind === 'table' || kind === 'view' || kind === 'materialized_view';
60
+ }
61
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { MigrationPlan, SchemaDefinition } from './model.js';
2
+ export declare function planDiff(oldDefinitions: SchemaDefinition[], newDefinitions: SchemaDefinition[]): MigrationPlan;
3
+ //# sourceMappingURL=planner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAIV,aAAa,EAEb,gBAAgB,EAEjB,MAAM,YAAY,CAAA;AA2VnB,wBAAgB,QAAQ,CAAC,cAAc,EAAE,gBAAgB,EAAE,EAAE,cAAc,EAAE,gBAAgB,EAAE,GAAG,aAAa,CAkG9G"}