@chkit/core 0.1.2-beta.5 → 0.2.0-beta.11

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 (93) hide show
  1. package/README.md +26 -6
  2. package/dist/canonical.d.ts.map +1 -1
  3. package/dist/canonical.js +63 -7
  4. package/dist/canonical.js.map +1 -1
  5. package/dist/column-default.d.ts +62 -0
  6. package/dist/column-default.d.ts.map +1 -0
  7. package/dist/column-default.js +212 -0
  8. package/dist/column-default.js.map +1 -0
  9. package/dist/conflict-markers.d.ts +3 -0
  10. package/dist/conflict-markers.d.ts.map +1 -0
  11. package/dist/conflict-markers.js +9 -0
  12. package/dist/conflict-markers.js.map +1 -0
  13. package/dist/identifier.d.ts +22 -0
  14. package/dist/identifier.d.ts.map +1 -0
  15. package/dist/identifier.js +69 -0
  16. package/dist/identifier.js.map +1 -0
  17. package/dist/index.d.ts +10 -3
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +10 -3
  20. package/dist/index.js.map +1 -1
  21. package/dist/insert-columns.d.ts +13 -0
  22. package/dist/insert-columns.d.ts.map +1 -0
  23. package/dist/insert-columns.js +36 -0
  24. package/dist/insert-columns.js.map +1 -0
  25. package/dist/kafka.d.ts +9 -0
  26. package/dist/kafka.d.ts.map +1 -0
  27. package/dist/kafka.js +64 -0
  28. package/dist/kafka.js.map +1 -0
  29. package/dist/key-clause.d.ts +6 -1
  30. package/dist/key-clause.d.ts.map +1 -1
  31. package/dist/key-clause.js +12 -13
  32. package/dist/key-clause.js.map +1 -1
  33. package/dist/model-types.d.ts +123 -7
  34. package/dist/model-types.d.ts.map +1 -1
  35. package/dist/model.d.ts +4 -2
  36. package/dist/model.d.ts.map +1 -1
  37. package/dist/model.js +13 -3
  38. package/dist/model.js.map +1 -1
  39. package/dist/object-dependencies.d.ts +18 -0
  40. package/dist/object-dependencies.d.ts.map +1 -0
  41. package/dist/object-dependencies.js +351 -0
  42. package/dist/object-dependencies.js.map +1 -0
  43. package/dist/on-cluster.d.ts.map +1 -1
  44. package/dist/on-cluster.js +18 -9
  45. package/dist/on-cluster.js.map +1 -1
  46. package/dist/planner.d.ts.map +1 -1
  47. package/dist/planner.js +144 -81
  48. package/dist/planner.js.map +1 -1
  49. package/dist/projection.d.ts.map +1 -1
  50. package/dist/projection.js +5 -40
  51. package/dist/projection.js.map +1 -1
  52. package/dist/schema-loader.d.ts +2 -0
  53. package/dist/schema-loader.d.ts.map +1 -1
  54. package/dist/schema-loader.js +72 -5
  55. package/dist/schema-loader.js.map +1 -1
  56. package/dist/sql-lexer.d.ts +29 -0
  57. package/dist/sql-lexer.d.ts.map +1 -0
  58. package/dist/sql-lexer.js +220 -0
  59. package/dist/sql-lexer.js.map +1 -0
  60. package/dist/sql-normalizer.d.ts +48 -0
  61. package/dist/sql-normalizer.d.ts.map +1 -1
  62. package/dist/sql-normalizer.js +118 -1
  63. package/dist/sql-normalizer.js.map +1 -1
  64. package/dist/sql-scan.d.ts +20 -0
  65. package/dist/sql-scan.d.ts.map +1 -0
  66. package/dist/sql-scan.js +82 -0
  67. package/dist/sql-scan.js.map +1 -0
  68. package/dist/sql-splitter.d.ts.map +1 -1
  69. package/dist/sql-splitter.js +52 -5
  70. package/dist/sql-splitter.js.map +1 -1
  71. package/dist/sql.d.ts +9 -1
  72. package/dist/sql.d.ts.map +1 -1
  73. package/dist/sql.js +95 -36
  74. package/dist/sql.js.map +1 -1
  75. package/dist/text-index-sql.d.ts +6 -0
  76. package/dist/text-index-sql.d.ts.map +1 -0
  77. package/dist/text-index-sql.js +200 -0
  78. package/dist/text-index-sql.js.map +1 -0
  79. package/dist/text-index.d.ts +10 -0
  80. package/dist/text-index.d.ts.map +1 -0
  81. package/dist/text-index.js +121 -0
  82. package/dist/text-index.js.map +1 -0
  83. package/dist/ts-import.d.ts.map +1 -1
  84. package/dist/ts-import.js +23 -3
  85. package/dist/ts-import.js.map +1 -1
  86. package/dist/validate.d.ts.map +1 -1
  87. package/dist/validate.js +350 -3
  88. package/dist/validate.js.map +1 -1
  89. package/package.json +1 -1
  90. package/dist/utils.d.ts +0 -2
  91. package/dist/utils.d.ts.map +0 -1
  92. package/dist/utils.js +0 -2
  93. package/dist/utils.js.map +0 -1
package/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # @chkit/core
2
2
 
3
- Schema DSL, configuration, and diff engine for chkit.
3
+ TypeScript schema DSL, configuration, and diff engine for ClickHouse schema management.
4
4
 
5
5
  Part of the [chkit](https://github.com/obsessiondb/chkit) monorepo. This package is typically used together with the [`chkit`](https://www.npmjs.com/package/chkit) CLI.
6
6
 
7
7
  ## Install
8
8
 
9
- ```bash
10
- bun add @chkit/core
9
+ ```sh
10
+ bun add -d chkit @chkit/core
11
11
  ```
12
12
 
13
13
  ## Usage
@@ -15,7 +15,8 @@ bun add @chkit/core
15
15
  Define your ClickHouse schema in TypeScript:
16
16
 
17
17
  ```ts
18
- import { defineConfig, schema, table, view, materializedView } from '@chkit/core'
18
+ // src/db/schema/events.ts
19
+ import { schema, table } from '@chkit/core'
19
20
 
20
21
  const events = table({
21
22
  database: 'default',
@@ -24,10 +25,11 @@ const events = table({
24
25
  columns: [
25
26
  { name: 'id', type: 'UInt64' },
26
27
  { name: 'source', type: 'String' },
27
- { name: 'ingested_at', type: 'DateTime64(3)', default: 'fn:now64(3)' },
28
+ { name: 'occurred_at', type: 'DateTime64(3)', default: { expression: 'now64(3)' } },
28
29
  ],
29
30
  primaryKey: ['id'],
30
31
  orderBy: ['id'],
32
+ partitionBy: 'toYYYYMM(occurred_at)',
31
33
  })
32
34
 
33
35
  export default schema(events)
@@ -44,13 +46,31 @@ export default defineConfig({
44
46
  outDir: './chkit',
45
47
  clickhouse: {
46
48
  url: process.env.CLICKHOUSE_URL ?? 'http://localhost:8123',
49
+ username: process.env.CLICKHOUSE_USER ?? 'default',
50
+ password: process.env.CLICKHOUSE_PASSWORD ?? '',
51
+ database: 'default',
47
52
  },
48
53
  })
49
54
  ```
50
55
 
56
+ Set the connection environment variables for a development database, then generate, review, and apply a migration:
57
+
58
+ ```sh
59
+ bunx chkit generate --name create-events
60
+ # Review the SQL in chkit/migrations/ and preview the plan:
61
+ bunx chkit migrate --json
62
+ bunx chkit migrate --apply
63
+ bunx chkit check
64
+ ```
65
+
66
+ Commit schema definitions, migration files, and `chkit/meta/` together. Change a definition and repeat the workflow to evolve the database.
67
+
51
68
  ## Documentation
52
69
 
53
- See the [chkit documentation](https://chkit.obsessiondb.com).
70
+ - [First-schema tutorial](https://chkit.obsessiondb.com/tutorials/first-schema/) — a complete migration workflow.
71
+ - [Schema DSL reference](https://chkit.obsessiondb.com/schema/dsl-reference/) — tables, views, materialized views, dictionaries, and schema options.
72
+ - [Configuration](https://chkit.obsessiondb.com/configuration/overview/) — config files, connections, and plugins.
73
+ - [Python overview (alpha)](https://chkit.obsessiondb.com/python/overview/) — the equivalent schema workflow with `chkit-py`.
54
74
 
55
75
  ## License
56
76
 
@@ -1 +1 @@
1
- {"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,gBAAgB,EAIjB,MAAM,YAAY,CAAA;AA2JnB,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"}
1
+ {"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAMV,gBAAgB,EAIjB,MAAM,YAAY,CAAA;AAqNnB,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,GAAG,gBAAgB,CAK9E;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"}
package/dist/canonical.js CHANGED
@@ -1,7 +1,9 @@
1
1
  import { normalizeKeyColumns } from './key-clause.js';
2
2
  import { isSchemaDefinition } from './model.js';
3
3
  import { canonicalizeCodec } from './codec.js';
4
+ import { canonicalizeColumnDefault } from './column-default.js';
4
5
  import { canonicalizeProjection } from './projection.js';
6
+ import { canonicalizeTextIndex } from './text-index.js';
5
7
  import { normalizeEngine, normalizeSQLFragment } from './sql-normalizer.js';
6
8
  function sortByName(items) {
7
9
  return [...items].sort((a, b) => a.name.localeCompare(b.name));
@@ -11,24 +13,42 @@ function sortKind(kind) {
11
13
  return 0;
12
14
  if (kind === 'view')
13
15
  return 1;
14
- return 2;
16
+ if (kind === 'materialized_view')
17
+ return 2;
18
+ return 3;
15
19
  }
16
20
  function canonicalizeColumn(column) {
21
+ const { defaultKind, ...rest } = column;
17
22
  return {
18
- ...column,
23
+ ...rest,
24
+ defaultKind: defaultKind === 'DEFAULT' ? undefined : defaultKind,
19
25
  name: column.name.trim(),
20
26
  renamedFrom: column.renamedFrom?.trim(),
21
27
  type: typeof column.type === 'string' ? column.type.trim() : column.type,
22
28
  comment: column.comment?.trim(),
23
29
  codec: column.codec ? canonicalizeCodec(column.codec) : undefined,
30
+ // `{ expression }` becomes the legacy `fn:` string, so snapshots, plans,
31
+ // drift and chkit-py share one representation (#234). A column without a
32
+ // default gains no key, and an overwritten key keeps the position the
33
+ // spread gave it, so JSON-based column comparisons are unchanged.
34
+ ...(column.default !== undefined ? { default: canonicalizeColumnDefault(column.default) } : {}),
24
35
  };
25
36
  }
26
37
  function canonicalizeIndex(index) {
38
+ if (index.type === 'text')
39
+ return canonicalizeTextIndex(index);
27
40
  return {
28
41
  ...index,
29
42
  expression: normalizeSQLFragment(index.expression),
30
43
  };
31
44
  }
45
+ // A clause that is only comments is no clause: `ttl: '-- ts + INTERVAL 1 DAY'`
46
+ // must render `REMOVE TTL`, not `MODIFY TTL ;`.
47
+ function normalizeOptionalClause(value) {
48
+ if (!value)
49
+ return undefined;
50
+ return normalizeSQLFragment(value) || undefined;
51
+ }
32
52
  function canonicalizeTable(def) {
33
53
  const settings = def.settings
34
54
  ? Object.fromEntries(Object.entries(def.settings).sort(([a], [b]) => a.localeCompare(b)))
@@ -37,11 +57,12 @@ function canonicalizeTable(def) {
37
57
  const projections = def.projections
38
58
  ? sortByName(def.projections).map(canonicalizeProjection)
39
59
  : undefined;
40
- const orderBy = normalizeKeyColumns(def.orderBy);
60
+ const columnNames = new Set(def.columns.map((column) => column.name.trim()));
61
+ const orderBy = normalizeKeyColumns(def.orderBy, columnNames);
41
62
  // ClickHouse derives the primary key from ORDER BY when PRIMARY KEY is
42
63
  // omitted. Mirror that so a table with `orderBy` but no `primaryKey` is
43
64
  // valid instead of crashing on `undefined.flatMap`.
44
- const primaryKey = normalizeKeyColumns(def.primaryKey);
65
+ const primaryKey = normalizeKeyColumns(def.primaryKey, columnNames);
45
66
  return {
46
67
  ...def,
47
68
  database: def.database.trim(),
@@ -56,9 +77,9 @@ function canonicalizeTable(def) {
56
77
  columns: def.columns.map(canonicalizeColumn),
57
78
  primaryKey: primaryKey.length > 0 ? primaryKey : orderBy,
58
79
  orderBy,
59
- uniqueKey: def.uniqueKey ? normalizeKeyColumns(def.uniqueKey) : undefined,
60
- partitionBy: def.partitionBy ? normalizeSQLFragment(def.partitionBy) : undefined,
61
- ttl: def.ttl ? normalizeSQLFragment(def.ttl) : undefined,
80
+ uniqueKey: def.uniqueKey ? normalizeKeyColumns(def.uniqueKey, columnNames) : undefined,
81
+ partitionBy: normalizeOptionalClause(def.partitionBy),
82
+ ttl: normalizeOptionalClause(def.ttl),
62
83
  settings,
63
84
  indexes,
64
85
  projections,
@@ -142,11 +163,46 @@ function canonicalizeMaterializedView(def) {
142
163
  }
143
164
  return canonical;
144
165
  }
166
+ function canonicalizeDictionaryAttribute(attribute) {
167
+ return {
168
+ ...attribute,
169
+ name: attribute.name.trim(),
170
+ type: typeof attribute.type === 'string' ? attribute.type.trim() : attribute.type,
171
+ };
172
+ }
173
+ function canonicalizeDictionary(def) {
174
+ const settings = def.settings
175
+ ? Object.fromEntries(Object.entries(def.settings).sort(([a], [b]) => a.localeCompare(b)))
176
+ : undefined;
177
+ return {
178
+ ...def,
179
+ database: def.database.trim(),
180
+ name: def.name.trim(),
181
+ renamedFrom: def.renamedFrom
182
+ ? {
183
+ database: def.renamedFrom.database?.trim(),
184
+ name: def.renamedFrom.name.trim(),
185
+ }
186
+ : undefined,
187
+ attributes: def.attributes.map(canonicalizeDictionaryAttribute),
188
+ primaryKey: normalizeKeyColumns(def.primaryKey, new Set(def.attributes.map((attribute) => attribute.name.trim()))),
189
+ source: normalizeSQLFragment(def.source),
190
+ layout: normalizeSQLFragment(def.layout),
191
+ lifetime: normalizeSQLFragment(def.lifetime),
192
+ range: def.range
193
+ ? { min: def.range.min.trim(), max: def.range.max.trim() }
194
+ : undefined,
195
+ settings: settings && Object.keys(settings).length > 0 ? settings : undefined,
196
+ comment: def.comment?.trim(),
197
+ };
198
+ }
145
199
  export function canonicalizeDefinition(def) {
146
200
  if (def.kind === 'table')
147
201
  return canonicalizeTable(def);
148
202
  if (def.kind === 'view')
149
203
  return canonicalizeView(def);
204
+ if (def.kind === 'dictionary')
205
+ return canonicalizeDictionary(def);
150
206
  return canonicalizeMaterializedView(def);
151
207
  }
152
208
  export function definitionKey(def) {
@@ -1 +1 @@
1
- {"version":3,"file":"canonical.js","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canonical.js","sourceRoot":"","sources":["../src/canonical.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import type { ColumnDefaultValue, SQLExpression } from './model.js';
2
+ /** Legacy spelling of an expression default: `'fn:now()'` ≡ `{ expression: 'now()' }`. */
3
+ export declare const LEGACY_EXPRESSION_PREFIX = "fn:";
4
+ export type ParsedColumnDefault = {
5
+ kind: 'expression';
6
+ sql: string;
7
+ } | {
8
+ kind: 'literal';
9
+ value: string | number | boolean;
10
+ };
11
+ /**
12
+ * Classifies a column default. `{ expression }` and a legacy `'fn:'` string
13
+ * are SQL expressions, trimmed with their comments kept (an empty `# ` comment
14
+ * at the end is trimmed like whitespace); every other value is a literal.
15
+ * Canonical definitions, which snapshots and plugin hooks see, always use the
16
+ * `fn:` spelling, so read defaults through this function rather than
17
+ * inspecting the raw value.
18
+ */
19
+ export declare function parseColumnDefault(value: ColumnDefaultValue): ParsedColumnDefault;
20
+ /**
21
+ * Snapshot form of a default: an expression in either spelling becomes the
22
+ * trimmed `fn:` string (`{ expression: ' now() ' }` and `'fn: now()'` both give
23
+ * `'fn:now()'`), so switching spellings plans nothing. Literals are unchanged.
24
+ */
25
+ export declare function canonicalizeColumnDefault(value: ColumnDefaultValue): string | number | boolean;
26
+ /**
27
+ * SQL for a column default, whatever its `defaultKind`. An expression is its
28
+ * SQL without comments: chkit renders it on the column's line, where a `--`
29
+ * comment would swallow the `,`, COMMENT, CODEC or `;` that follows (#234). A
30
+ * string is a quoted literal with quotes and backslashes escaped; numbers and
31
+ * booleans render as written.
32
+ */
33
+ export declare function renderDefault(value: ColumnDefaultValue): string;
34
+ export declare function isSQLExpression(value: unknown): value is SQLExpression;
35
+ /** Whether a quoted string literal is a valid value of `type`, whatever its Nullable or LowCardinality wrappers. */
36
+ export declare function columnTypeAcceptsStringLiteral(type: string): boolean;
37
+ /**
38
+ * Whether ClickHouse accepts any quoted string as a default of the rendered
39
+ * column type `type` and stores NULL when the text does not parse: a Nullable
40
+ * number, decimal, date, time, UUID or IP address. SimpleAggregateFunction
41
+ * defers to its value type, as ClickHouse does.
42
+ */
43
+ export declare function storesUnparsableLiteralAsNull(type: string): boolean;
44
+ /**
45
+ * storesUnparsableLiteralAsNull for an EPHEMERAL default, which ClickHouse
46
+ * reads but never stores, so it skips the checks for stored column types.
47
+ * LowCardinality around a Nullable number, date, time, UUID or IP address
48
+ * then reads NULL too, where a DEFAULT column of that type is refused; a type
49
+ * that LowCardinality rejects (decimals, DateTime64, Time64) still fails.
50
+ * Verified on ClickHouse 26.3 (#234).
51
+ */
52
+ export declare function readsUnparsableEphemeralLiteralAsNull(type: string): boolean;
53
+ /** Text that starts with a function call, e.g. `now()` or `toDate(ts) + 1`. */
54
+ export declare function startsWithFunctionCall(value: string): boolean;
55
+ /**
56
+ * Trims an expression. ClickHouse reads `#` as a comment only before a space
57
+ * or `!`, so trimming the space of an empty `# ` comment at the end would
58
+ * leave a bare `#`, a syntax error. That comment is trimmed with the
59
+ * whitespace instead.
60
+ */
61
+ export declare function trimExpression(sql: string): string;
62
+ //# sourceMappingURL=column-default.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-default.d.ts","sourceRoot":"","sources":["../src/column-default.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAInE,0FAA0F;AAC1F,eAAO,MAAM,wBAAwB,QAAQ,CAAA;AA6D7C,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;CAAE,CAAA;AAEzD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,mBAAmB,CAMjF;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAG9F;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAK/D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAEtE;AAED,oHAAoH;AACpH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQpE;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED;;;;;;;GAOG;AACH,wBAAgB,qCAAqC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAc3E;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOlD"}
@@ -0,0 +1,212 @@
1
+ import { splitTopLevelComma } from './key-clause.js';
2
+ import { tokenizeSQL } from './sql-lexer.js';
3
+ import { stripSQLComments } from './sql-normalizer.js';
4
+ /** Legacy spelling of an expression default: `'fn:now()'` ≡ `{ expression: 'now()' }`. */
5
+ export const LEGACY_EXPRESSION_PREFIX = 'fn:';
6
+ /**
7
+ * Type families (upper-cased) whose columns a quoted string literal can
8
+ * populate: String and FixedString with their SQL aliases (case-insensitive in
9
+ * ClickHouse), Enum labels, and Dynamic. Verified on ClickHouse 26.3 by
10
+ * creating `c <type> DEFAULT 'now()'` for every family in
11
+ * system.data_type_families (#234). Nullable and LowCardinality wrappers,
12
+ * Variant and SimpleAggregateFunction are resolved structurally.
13
+ */
14
+ const STRING_LITERAL_TYPE_FAMILIES = new Set([
15
+ 'STRING', 'FIXEDSTRING', 'ENUM', 'ENUM8', 'ENUM16', 'DYNAMIC',
16
+ // FixedString alias
17
+ 'BINARY',
18
+ // String aliases
19
+ 'BINARY LARGE OBJECT', 'BINARY VARYING', 'BLOB', 'BYTEA', 'CHAR', 'CHAR LARGE OBJECT',
20
+ 'CHAR VARYING', 'CHARACTER', 'CHARACTER LARGE OBJECT', 'CHARACTER VARYING', 'CLOB',
21
+ 'LONGBLOB', 'LONGTEXT', 'MEDIUMBLOB', 'MEDIUMTEXT', 'NATIONAL CHAR', 'NATIONAL CHAR VARYING',
22
+ 'NATIONAL CHARACTER', 'NATIONAL CHARACTER LARGE OBJECT', 'NATIONAL CHARACTER VARYING',
23
+ 'NCHAR', 'NCHAR LARGE OBJECT', 'NCHAR VARYING', 'NVARCHAR', 'TEXT', 'TINYBLOB', 'TINYTEXT',
24
+ 'VARBINARY', 'VARCHAR', 'VARCHAR2',
25
+ ]);
26
+ /**
27
+ * Type families (upper-cased, with their SQL aliases) for which a Nullable
28
+ * column accepts any quoted string default and stores NULL when the text does
29
+ * not parse: numbers, decimals, dates and times, UUID and IP addresses. Bool
30
+ * rejects the text even inside Nullable. Verified on ClickHouse 26.3 by
31
+ * inserting a row into `c Nullable(<type>) DEFAULT 'now()'` for each (#234).
32
+ */
33
+ const NULL_ON_UNPARSABLE_LITERAL_FAMILIES = new Set([
34
+ 'INT8', 'INT16', 'INT32', 'INT64', 'INT128', 'INT256',
35
+ 'UINT8', 'UINT16', 'UINT32', 'UINT64', 'UINT128', 'UINT256',
36
+ 'BFLOAT16', 'FLOAT32', 'FLOAT64',
37
+ 'DECIMAL', 'DECIMAL32', 'DECIMAL64', 'DECIMAL128', 'DECIMAL256',
38
+ 'DATE', 'DATE32', 'DATETIME', 'DATETIME32', 'DATETIME64', 'TIME', 'TIME64',
39
+ 'UUID', 'IPV4', 'IPV6',
40
+ // Integer aliases
41
+ 'BIGINT', 'BIGINT SIGNED', 'BIGINT UNSIGNED', 'BIT', 'BYTE', 'INT', 'INT SIGNED', 'INT UNSIGNED',
42
+ 'INT1', 'INT1 SIGNED', 'INT1 UNSIGNED', 'INTEGER', 'INTEGER SIGNED', 'INTEGER UNSIGNED',
43
+ 'MEDIUMINT', 'MEDIUMINT SIGNED', 'MEDIUMINT UNSIGNED', 'SET', 'SIGNED', 'SMALLINT',
44
+ 'SMALLINT SIGNED', 'SMALLINT UNSIGNED', 'TINYINT', 'TINYINT SIGNED', 'TINYINT UNSIGNED',
45
+ 'UNSIGNED', 'YEAR',
46
+ // Float, Decimal, DateTime and IP aliases
47
+ 'DOUBLE', 'DOUBLE PRECISION', 'FLOAT', 'REAL', 'SINGLE', 'DEC', 'FIXED', 'NUMERIC',
48
+ 'TIMESTAMP', 'INET4', 'INET6',
49
+ ]);
50
+ /**
51
+ * Families of NULL_ON_UNPARSABLE_LITERAL_FAMILIES that ClickHouse refuses
52
+ * inside LowCardinality: decimals, DateTime64 and Time64. Verified on
53
+ * ClickHouse 26.3 by creating `c LowCardinality(Nullable(<type>)) EPHEMERAL 'now()'`
54
+ * for each (#234).
55
+ */
56
+ const LOW_CARDINALITY_REJECTED_FAMILIES = new Set([
57
+ 'DECIMAL', 'DECIMAL32', 'DECIMAL64', 'DECIMAL128', 'DECIMAL256', 'DEC', 'FIXED', 'NUMERIC',
58
+ 'DATETIME64', 'TIME64',
59
+ ]);
60
+ const FUNCTION_CALL_START = /^[A-Za-z_][A-Za-z0-9_]*\s*\(/;
61
+ /**
62
+ * Classifies a column default. `{ expression }` and a legacy `'fn:'` string
63
+ * are SQL expressions, trimmed with their comments kept (an empty `# ` comment
64
+ * at the end is trimmed like whitespace); every other value is a literal.
65
+ * Canonical definitions, which snapshots and plugin hooks see, always use the
66
+ * `fn:` spelling, so read defaults through this function rather than
67
+ * inspecting the raw value.
68
+ */
69
+ export function parseColumnDefault(value) {
70
+ if (isSQLExpression(value))
71
+ return { kind: 'expression', sql: trimExpression(value.expression) };
72
+ if (typeof value === 'string' && value.startsWith(LEGACY_EXPRESSION_PREFIX)) {
73
+ return { kind: 'expression', sql: trimExpression(value.slice(LEGACY_EXPRESSION_PREFIX.length)) };
74
+ }
75
+ return { kind: 'literal', value };
76
+ }
77
+ /**
78
+ * Snapshot form of a default: an expression in either spelling becomes the
79
+ * trimmed `fn:` string (`{ expression: ' now() ' }` and `'fn: now()'` both give
80
+ * `'fn:now()'`), so switching spellings plans nothing. Literals are unchanged.
81
+ */
82
+ export function canonicalizeColumnDefault(value) {
83
+ const parsed = parseColumnDefault(value);
84
+ return parsed.kind === 'expression' ? `${LEGACY_EXPRESSION_PREFIX}${parsed.sql}` : parsed.value;
85
+ }
86
+ /**
87
+ * SQL for a column default, whatever its `defaultKind`. An expression is its
88
+ * SQL without comments: chkit renders it on the column's line, where a `--`
89
+ * comment would swallow the `,`, COMMENT, CODEC or `;` that follows (#234). A
90
+ * string is a quoted literal with quotes and backslashes escaped; numbers and
91
+ * booleans render as written.
92
+ */
93
+ export function renderDefault(value) {
94
+ const parsed = parseColumnDefault(value);
95
+ if (parsed.kind === 'expression')
96
+ return stripSQLComments(parsed.sql);
97
+ if (typeof parsed.value === 'string')
98
+ return `'${parsed.value.replace(/\\/g, '\\\\').replace(/'/g, "''")}'`;
99
+ return String(parsed.value);
100
+ }
101
+ export function isSQLExpression(value) {
102
+ return typeof value === 'object' && value !== null && 'expression' in value && typeof value.expression === 'string';
103
+ }
104
+ /** Whether a quoted string literal is a valid value of `type`, whatever its Nullable or LowCardinality wrappers. */
105
+ export function columnTypeAcceptsStringLiteral(type) {
106
+ const { family, args } = parseTypeFamily(unwrapColumnType(type));
107
+ if (family === 'SIMPLEAGGREGATEFUNCTION') {
108
+ const valueType = args.at(-1);
109
+ return args.length >= 2 && valueType !== undefined && columnTypeAcceptsStringLiteral(valueType);
110
+ }
111
+ if (family === 'VARIANT')
112
+ return args.some((member) => columnTypeAcceptsStringLiteral(member));
113
+ return STRING_LITERAL_TYPE_FAMILIES.has(family);
114
+ }
115
+ /**
116
+ * Whether ClickHouse accepts any quoted string as a default of the rendered
117
+ * column type `type` and stores NULL when the text does not parse: a Nullable
118
+ * number, decimal, date, time, UUID or IP address. SimpleAggregateFunction
119
+ * defers to its value type, as ClickHouse does.
120
+ */
121
+ export function storesUnparsableLiteralAsNull(type) {
122
+ return literalFallsBackToNull(type, false);
123
+ }
124
+ /**
125
+ * storesUnparsableLiteralAsNull for an EPHEMERAL default, which ClickHouse
126
+ * reads but never stores, so it skips the checks for stored column types.
127
+ * LowCardinality around a Nullable number, date, time, UUID or IP address
128
+ * then reads NULL too, where a DEFAULT column of that type is refused; a type
129
+ * that LowCardinality rejects (decimals, DateTime64, Time64) still fails.
130
+ * Verified on ClickHouse 26.3 (#234).
131
+ */
132
+ export function readsUnparsableEphemeralLiteralAsNull(type) {
133
+ const { family, args } = parseTypeFamily(type);
134
+ const [inner] = args;
135
+ if (family !== 'LOWCARDINALITY' || args.length !== 1 || inner === undefined) {
136
+ return storesUnparsableLiteralAsNull(type);
137
+ }
138
+ const nullable = parseTypeFamily(inner);
139
+ const [base] = nullable.args;
140
+ return (nullable.family === 'NULLABLE' &&
141
+ base !== undefined &&
142
+ !LOW_CARDINALITY_REJECTED_FAMILIES.has(parseTypeFamily(base).family) &&
143
+ storesUnparsableLiteralAsNull(inner));
144
+ }
145
+ /** Text that starts with a function call, e.g. `now()` or `toDate(ts) + 1`. */
146
+ export function startsWithFunctionCall(value) {
147
+ return FUNCTION_CALL_START.test(value.trim());
148
+ }
149
+ /**
150
+ * Trims an expression. ClickHouse reads `#` as a comment only before a space
151
+ * or `!`, so trimming the space of an empty `# ` comment at the end would
152
+ * leave a bare `#`, a syntax error. That comment is trimmed with the
153
+ * whitespace instead.
154
+ */
155
+ export function trimExpression(sql) {
156
+ let end = sql.length;
157
+ for (const token of tokenizeSQL(sql).reverse()) {
158
+ if (!isBlankAtEnd(token))
159
+ break;
160
+ end = token.start;
161
+ }
162
+ return sql.slice(0, end).trim();
163
+ }
164
+ // Whitespace, including the Unicode whitespace that trim() drops and the lexer
165
+ // reads as punctuation, and a `#` comment without text.
166
+ function isBlankAtEnd(token) {
167
+ if (token.kind === 'whitespace')
168
+ return true;
169
+ if (token.kind === 'punctuation')
170
+ return /^\s$/.test(token.text);
171
+ return token.kind === 'line_comment' && /^#\s*$/.test(token.text);
172
+ }
173
+ function literalFallsBackToNull(type, insideNullable) {
174
+ const { family, args } = parseTypeFamily(type);
175
+ if (family === 'SIMPLEAGGREGATEFUNCTION') {
176
+ const valueType = args.at(-1);
177
+ return args.length >= 2 && valueType !== undefined && literalFallsBackToNull(valueType, insideNullable);
178
+ }
179
+ // Nullable(Nullable(...)) and Nullable(LowCardinality(...)) are rejected.
180
+ if (family === 'NULLABLE') {
181
+ const [inner] = args;
182
+ return !insideNullable && args.length === 1 && inner !== undefined && literalFallsBackToNull(inner, true);
183
+ }
184
+ return insideNullable && NULL_ON_UNPARSABLE_LITERAL_FAMILIES.has(family);
185
+ }
186
+ /** Strips outer `Nullable(…)` and `LowCardinality(…)` layers. */
187
+ function unwrapColumnType(type) {
188
+ let base = type.trim();
189
+ for (;;) {
190
+ const { family, args } = parseTypeFamily(base);
191
+ const [inner] = args;
192
+ if (args.length !== 1 || inner === undefined || (family !== 'NULLABLE' && family !== 'LOWCARDINALITY')) {
193
+ return base;
194
+ }
195
+ base = inner;
196
+ }
197
+ }
198
+ /** `DateTime64(3, 'UTC')` → `{ family: 'DATETIME64', args: ['3', "'UTC'"] }`. The family is upper-cased with whitespace collapsed. */
199
+ function parseTypeFamily(type) {
200
+ const trimmed = type.trim();
201
+ const open = trimmed.indexOf('(');
202
+ if (open === -1 || !trimmed.endsWith(')'))
203
+ return { family: normalizeTypeFamily(trimmed), args: [] };
204
+ return {
205
+ family: normalizeTypeFamily(trimmed.slice(0, open)),
206
+ args: splitTopLevelComma(trimmed.slice(open + 1, -1)),
207
+ };
208
+ }
209
+ function normalizeTypeFamily(name) {
210
+ return name.trim().replace(/\s+/g, ' ').toUpperCase();
211
+ }
212
+ //# sourceMappingURL=column-default.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-default.js","sourceRoot":"","sources":["../src/column-default.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Whether `text` has a line that git writes for an unresolved merge conflict. */
2
+ export declare function hasConflictMarkers(text: string): boolean;
3
+ //# sourceMappingURL=conflict-markers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict-markers.d.ts","sourceRoot":"","sources":["../src/conflict-markers.ts"],"names":[],"mappings":"AAKA,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD"}
@@ -0,0 +1,9 @@
1
+ // Git writes conflict markers at the start of a line: `<<<<<<< ours`, `=======`,
2
+ // `>>>>>>> theirs`, and `||||||| base` with diff3/zdiff3. `conflict-marker-size`
3
+ // can make them longer than 7 characters.
4
+ const CONFLICT_MARKER_LINE = /^(?:<{7,}|>{7,}|\|{7,})(?:[ \t].*)?$|^={7,}[ \t]*$/;
5
+ /** Whether `text` has a line that git writes for an unresolved merge conflict. */
6
+ export function hasConflictMarkers(text) {
7
+ return text.split(/\r?\n/).some((line) => CONFLICT_MARKER_LINE.test(line));
8
+ }
9
+ //# sourceMappingURL=conflict-markers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict-markers.js","sourceRoot":"","sources":["../src/conflict-markers.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,iFAAiF;AACjF,0CAA0C;AAC1C,MAAM,oBAAoB,GAAG,oDAAoD,CAAA;AAEjF,kFAAkF;AAClF,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AAC5E,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Wraps a name in backticks, escaping backslashes and backticks so the name can
3
+ * never terminate the quoted identifier early. Matches ClickHouse's own
4
+ * formatting of quoted identifiers.
5
+ */
6
+ export declare function quoteIdentifier(name: string): string;
7
+ /**
8
+ * Renders a database or object name. Plain identifiers stay bare so generated
9
+ * SQL is unchanged for existing schemas; anything else is quoted and escaped.
10
+ */
11
+ export declare function renderIdentifier(name: string): string;
12
+ export declare function renderQualifiedName(database: string, name: string): string;
13
+ /** Returns why a name cannot be used as a ClickHouse identifier, if it can't. */
14
+ export declare function describeInvalidIdentifier(name: string): string | undefined;
15
+ /**
16
+ * Replaces every backtick-quoted identifier in a SQL fragment with its raw,
17
+ * unescaped name, leaving string literals untouched. Used to compare clauses
18
+ * that ClickHouse re-renders with its own quoting (e.g. key clauses in drift).
19
+ */
20
+ export declare function unquoteIdentifiers(sql: string): string;
21
+ export declare function unescapeQuoted(body: string, quote?: string): string;
22
+ //# sourceMappingURL=identifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifier.d.ts","sourceRoot":"","sources":["../src/identifier.ts"],"names":[],"mappings":"AAaA;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,iFAAiF;AACjF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI1E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAqBtD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,MAAM,CAEhE"}