ormbridge 0.9.0 → 0.11.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 (146) hide show
  1. package/README.md +19 -18
  2. package/dist/cliRunner.js +4 -4
  3. package/dist/cliRunner.js.map +1 -1
  4. package/dist/config.d.ts +2 -2
  5. package/dist/convert.js +30 -1
  6. package/dist/convert.js.map +1 -1
  7. package/dist/emitters/cockroach.d.ts +33 -0
  8. package/dist/emitters/cockroach.js +81 -0
  9. package/dist/emitters/cockroach.js.map +1 -0
  10. package/dist/emitters/doctrine.js +11 -0
  11. package/dist/emitters/doctrine.js.map +1 -1
  12. package/dist/emitters/drizzle.js +39 -4
  13. package/dist/emitters/drizzle.js.map +1 -1
  14. package/dist/emitters/efcore.js +18 -1
  15. package/dist/emitters/efcore.js.map +1 -1
  16. package/dist/emitters/efcoreColumns.js +23 -2
  17. package/dist/emitters/efcoreColumns.js.map +1 -1
  18. package/dist/emitters/gorm.js +20 -1
  19. package/dist/emitters/gorm.js.map +1 -1
  20. package/dist/emitters/jpa.d.ts +36 -0
  21. package/dist/emitters/jpa.js +262 -0
  22. package/dist/emitters/jpa.js.map +1 -0
  23. package/dist/emitters/jpaColumns.d.ts +27 -0
  24. package/dist/emitters/jpaColumns.js +342 -0
  25. package/dist/emitters/jpaColumns.js.map +1 -0
  26. package/dist/emitters/jpaDefaults.d.ts +24 -0
  27. package/dist/emitters/jpaDefaults.js +223 -0
  28. package/dist/emitters/jpaDefaults.js.map +1 -0
  29. package/dist/emitters/jpaEnums.d.ts +11 -0
  30. package/dist/emitters/jpaEnums.js +134 -0
  31. package/dist/emitters/jpaEnums.js.map +1 -0
  32. package/dist/emitters/jpaFormat.d.ts +16 -0
  33. package/dist/emitters/jpaFormat.js +73 -0
  34. package/dist/emitters/jpaFormat.js.map +1 -0
  35. package/dist/emitters/jpaKeys.d.ts +25 -0
  36. package/dist/emitters/jpaKeys.js +110 -0
  37. package/dist/emitters/jpaKeys.js.map +1 -0
  38. package/dist/emitters/jpaNames.d.ts +26 -0
  39. package/dist/emitters/jpaNames.js +234 -0
  40. package/dist/emitters/jpaNames.js.map +1 -0
  41. package/dist/emitters/jpaRelations.d.ts +41 -0
  42. package/dist/emitters/jpaRelations.js +304 -0
  43. package/dist/emitters/jpaRelations.js.map +1 -0
  44. package/dist/emitters/jpaRender.d.ts +10 -0
  45. package/dist/emitters/jpaRender.js +81 -0
  46. package/dist/emitters/jpaRender.js.map +1 -0
  47. package/dist/emitters/jpaScalars.d.ts +32 -0
  48. package/dist/emitters/jpaScalars.js +201 -0
  49. package/dist/emitters/jpaScalars.js.map +1 -0
  50. package/dist/emitters/jpaTable.d.ts +10 -0
  51. package/dist/emitters/jpaTable.js +109 -0
  52. package/dist/emitters/jpaTable.js.map +1 -0
  53. package/dist/emitters/jpaTypes.d.ts +85 -0
  54. package/dist/emitters/jpaTypes.js +36 -0
  55. package/dist/emitters/jpaTypes.js.map +1 -0
  56. package/dist/emitters/laravel.js +11 -0
  57. package/dist/emitters/laravel.js.map +1 -1
  58. package/dist/emitters/prisma.d.ts +1 -1
  59. package/dist/emitters/prisma.js +47 -5
  60. package/dist/emitters/prisma.js.map +1 -1
  61. package/dist/emitters/sequelize.js +82 -6
  62. package/dist/emitters/sequelize.js.map +1 -1
  63. package/dist/emitters/sqlClickhouse.d.ts +43 -0
  64. package/dist/emitters/sqlClickhouse.js +265 -0
  65. package/dist/emitters/sqlClickhouse.js.map +1 -0
  66. package/dist/emitters/sqlClickhouseIndexes.d.ts +3 -0
  67. package/dist/emitters/sqlClickhouseIndexes.js +98 -0
  68. package/dist/emitters/sqlClickhouseIndexes.js.map +1 -0
  69. package/dist/emitters/sqlClickhouseTypes.d.ts +39 -0
  70. package/dist/emitters/sqlClickhouseTypes.js +360 -0
  71. package/dist/emitters/sqlClickhouseTypes.js.map +1 -0
  72. package/dist/emitters/sqlDdl.d.ts +29 -1
  73. package/dist/emitters/sqlDdl.js +141 -21
  74. package/dist/emitters/sqlDdl.js.map +1 -1
  75. package/dist/emitters/sqlalchemy.d.ts +7 -1
  76. package/dist/emitters/sqlalchemy.js +39 -0
  77. package/dist/emitters/sqlalchemy.js.map +1 -1
  78. package/dist/emitters/typeorm.js +44 -9
  79. package/dist/emitters/typeorm.js.map +1 -1
  80. package/dist/formats.d.ts +5 -2
  81. package/dist/formats.js +36 -1
  82. package/dist/formats.js.map +1 -1
  83. package/dist/index.d.ts +4 -0
  84. package/dist/index.js +2 -0
  85. package/dist/index.js.map +1 -1
  86. package/dist/io.js +27 -1
  87. package/dist/io.js.map +1 -1
  88. package/dist/parsers/javaSyntax.d.ts +120 -0
  89. package/dist/parsers/javaSyntax.js +304 -0
  90. package/dist/parsers/javaSyntax.js.map +1 -0
  91. package/dist/parsers/javaValues.d.ts +5 -0
  92. package/dist/parsers/javaValues.js +187 -0
  93. package/dist/parsers/javaValues.js.map +1 -0
  94. package/dist/parsers/jpa.d.ts +17 -0
  95. package/dist/parsers/jpa.js +131 -0
  96. package/dist/parsers/jpa.js.map +1 -0
  97. package/dist/parsers/jpaAnnotations.d.ts +46 -0
  98. package/dist/parsers/jpaAnnotations.js +156 -0
  99. package/dist/parsers/jpaAnnotations.js.map +1 -0
  100. package/dist/parsers/jpaBuild.d.ts +4 -0
  101. package/dist/parsers/jpaBuild.js +297 -0
  102. package/dist/parsers/jpaBuild.js.map +1 -0
  103. package/dist/parsers/jpaClasses.d.ts +27 -0
  104. package/dist/parsers/jpaClasses.js +257 -0
  105. package/dist/parsers/jpaClasses.js.map +1 -0
  106. package/dist/parsers/jpaCollections.d.ts +12 -0
  107. package/dist/parsers/jpaCollections.js +106 -0
  108. package/dist/parsers/jpaCollections.js.map +1 -0
  109. package/dist/parsers/jpaColumns.d.ts +26 -0
  110. package/dist/parsers/jpaColumns.js +361 -0
  111. package/dist/parsers/jpaColumns.js.map +1 -0
  112. package/dist/parsers/jpaEntities.d.ts +9 -0
  113. package/dist/parsers/jpaEntities.js +181 -0
  114. package/dist/parsers/jpaEntities.js.map +1 -0
  115. package/dist/parsers/jpaIndexes.d.ts +12 -0
  116. package/dist/parsers/jpaIndexes.js +87 -0
  117. package/dist/parsers/jpaIndexes.js.map +1 -0
  118. package/dist/parsers/jpaJoins.d.ts +68 -0
  119. package/dist/parsers/jpaJoins.js +131 -0
  120. package/dist/parsers/jpaJoins.js.map +1 -0
  121. package/dist/parsers/jpaModel.d.ts +73 -0
  122. package/dist/parsers/jpaModel.js +2 -0
  123. package/dist/parsers/jpaModel.js.map +1 -0
  124. package/dist/parsers/jpaNotes.d.ts +20 -0
  125. package/dist/parsers/jpaNotes.js +138 -0
  126. package/dist/parsers/jpaNotes.js.map +1 -0
  127. package/dist/parsers/jpaRelations.d.ts +4 -0
  128. package/dist/parsers/jpaRelations.js +242 -0
  129. package/dist/parsers/jpaRelations.js.map +1 -0
  130. package/dist/parsers/jpaTypes.d.ts +23 -0
  131. package/dist/parsers/jpaTypes.js +232 -0
  132. package/dist/parsers/jpaTypes.js.map +1 -0
  133. package/dist/parsers/prisma.js +9 -1
  134. package/dist/parsers/prisma.js.map +1 -1
  135. package/dist/parsers/sqlDdl.js +40 -2
  136. package/dist/parsers/sqlDdl.js.map +1 -1
  137. package/dist/parsers/sqlSyntax.js +15 -1
  138. package/dist/parsers/sqlSyntax.js.map +1 -1
  139. package/dist/parsers/sqlTypes.js +37 -2
  140. package/dist/parsers/sqlTypes.js.map +1 -1
  141. package/dist/parsers/typeorm.js +2 -0
  142. package/dist/parsers/typeorm.js.map +1 -1
  143. package/dist/styles.d.ts +3 -2
  144. package/dist/styles.js +4 -1
  145. package/dist/styles.js.map +1 -1
  146. package/package.json +8 -1
@@ -0,0 +1,98 @@
1
+ import { limitIdentifier } from '../naming.js';
2
+ import { columnNameOf } from './sqlDdl.js';
3
+ import { chQuote } from './sqlClickhouse.js';
4
+ function skipTypeOf(kinds, fulltext) {
5
+ if (kinds.includes('map')) {
6
+ return undefined;
7
+ }
8
+ if (fulltext && kinds.length === 1 && kinds[0] === 'string') {
9
+ return { type: 'tokenbf_v1(10240, 3, 0)', granularity: 1 };
10
+ }
11
+ if (kinds.length > 1) {
12
+ return { type: 'set(100)', granularity: 4 };
13
+ }
14
+ switch (kinds[0]) {
15
+ case 'integer':
16
+ case 'float':
17
+ case 'decimal':
18
+ case 'bool':
19
+ case 'date':
20
+ case 'dateTime':
21
+ return { type: 'minmax', granularity: 4 };
22
+ case 'enum':
23
+ return { type: 'set(100)', granularity: 4 };
24
+ default:
25
+ return { type: 'bloom_filter', granularity: 1 };
26
+ }
27
+ }
28
+ function warnAboutIndex(context, label, index, skip) {
29
+ if (index.isUnique) {
30
+ context.warnings.push(`${label}: ClickHouse has no unique indexes; it was written as a data-skipping index (${skip.type}) and uniqueness is not enforced (a ReplacingMergeTree can deduplicate by ORDER BY key).`);
31
+ }
32
+ if (index.kind === 'fulltext' && !skip.type.startsWith('tokenbf')) {
33
+ context.warnings.push(`${label}: a full-text index is only written as tokenbf_v1 for a single String column; it was written as ${skip.type}.`);
34
+ }
35
+ const dropped = [];
36
+ if (index.method !== undefined) {
37
+ dropped.push(`type ${index.method}`);
38
+ }
39
+ if (index.clustered !== undefined) {
40
+ dropped.push('clustered');
41
+ }
42
+ if (index.fieldOptions !== undefined) {
43
+ dropped.push('sort order, prefix length and operator class');
44
+ }
45
+ if (dropped.length > 0) {
46
+ context.warnings.push(`${label}: the index option(s) ${dropped.join(', ')} have no ClickHouse equivalent and were dropped.`);
47
+ }
48
+ }
49
+ /** The `INDEX ...` clauses of a table. */
50
+ export function buildClickhouseIndexes(context, table) {
51
+ const model = table.model;
52
+ const clauses = [];
53
+ const used = new Set();
54
+ for (const index of model.indexes) {
55
+ const label = `${model.name} index (${index.fields.join(', ')})`;
56
+ const columns = [];
57
+ for (const name of index.fields) {
58
+ const column = columnNameOf(model, name);
59
+ if (column === undefined) {
60
+ context.warnings.push(`${model.name}: an index references "${name}", which is not a field of the model; the index was skipped.`);
61
+ break;
62
+ }
63
+ columns.push(column);
64
+ }
65
+ if (columns.length !== index.fields.length || columns.length === 0) {
66
+ continue;
67
+ }
68
+ const kinds = [];
69
+ for (const column of columns) {
70
+ const written = table.columns.find((candidate) => candidate.name === column);
71
+ if (written !== undefined) {
72
+ kinds.push(written.type.kind);
73
+ }
74
+ }
75
+ if (kinds.length !== columns.length) {
76
+ context.warnings.push(`${label}: the index refers to a column that was not written; the index was skipped.`);
77
+ continue;
78
+ }
79
+ const skip = skipTypeOf(kinds, index.kind === 'fulltext');
80
+ if (skip === undefined) {
81
+ context.warnings.push(`${label}: ClickHouse cannot index a Map column with a data-skipping index; the index was skipped.`);
82
+ continue;
83
+ }
84
+ warnAboutIndex(context, label, index, skip);
85
+ const wanted = index.name ?? `${model.tableName}_${columns.join('_')}_idx`;
86
+ let name = limitIdentifier(wanted, 128);
87
+ for (let suffix = 2; used.has(name.toLowerCase()); suffix += 1) {
88
+ name = `${limitIdentifier(wanted, 120)}_${suffix}`;
89
+ }
90
+ used.add(name.toLowerCase());
91
+ const expression = columns.length === 1
92
+ ? chQuote(columns[0] ?? '')
93
+ : `(${columns.map(chQuote).join(', ')})`;
94
+ clauses.push(`INDEX ${chQuote(name)} ${expression} TYPE ${skip.type} GRANULARITY ${skip.granularity}`);
95
+ }
96
+ return clauses;
97
+ }
98
+ //# sourceMappingURL=sqlClickhouseIndexes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlClickhouseIndexes.js","sourceRoot":"","sources":["../../src/emitters/sqlClickhouseIndexes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { IrDefault, IrEnum, IrField } from '../ir.js';
2
+ /**
3
+ * Column types and defaults of the ClickHouse dialect of the SQL DDL writer (see sqlClickhouse.ts).
4
+ *
5
+ * ClickHouse columns are non-nullable unless the type is wrapped in `Nullable(...)`, and `Nullable`
6
+ * cannot wrap an `Array` or a `Map`. Strings carry no length limit, integers are signed unless a
7
+ * Prisma `@db.Unsigned*` native type says otherwise, and a few IR types (time of day, ranges, JSON)
8
+ * have no faithful ClickHouse type and are written as `String` with a column comment.
9
+ */
10
+ export interface ChTypeContext {
11
+ warnings: string[];
12
+ enums: Map<string, IrEnum>;
13
+ }
14
+ /** What a ClickHouse type is, for the decisions that depend on it (nullability, index type, defaults). */
15
+ export type ChKind = 'string' | 'integer' | 'float' | 'decimal' | 'bool' | 'date' | 'dateTime' | 'uuid' | 'ip' | 'enum' | 'array' | 'map' | 'other';
16
+ export interface ChType {
17
+ /** The type without `Nullable(...)`. */
18
+ sql: string;
19
+ kind: ChKind;
20
+ /** False for Array and Map, which ClickHouse does not allow inside Nullable. */
21
+ nullable: boolean;
22
+ /** True when a literal default is written as a quoted string. */
23
+ textual: boolean;
24
+ comment?: string;
25
+ }
26
+ /** A string literal: the backslash is an escape character in ClickHouse, a quote is doubled. */
27
+ export declare function chString(value: string): string;
28
+ /** The ClickHouse type of a field (an array field becomes nested `Array(...)`), without `Nullable`. */
29
+ export declare function clickhouseType(context: ChTypeContext, label: string, field: IrField): ChType;
30
+ /** Wraps a type in `Nullable(...)` when the column is nullable and ClickHouse allows it. */
31
+ export declare function withNullability(type: ChType, nullable: boolean): string;
32
+ export declare function enumMember(definition: IrEnum | undefined, raw: string): string | undefined;
33
+ export interface DefaultResult {
34
+ sql?: string;
35
+ /** Why the default was dropped, when it was. */
36
+ dropped?: string;
37
+ }
38
+ /** The text after DEFAULT for a field, or a reason the default cannot be written. */
39
+ export declare function clickhouseDefault(context: ChTypeContext, label: string, field: IrField, type: ChType, value: IrDefault): DefaultResult;
@@ -0,0 +1,360 @@
1
+ /** A string literal: the backslash is an escape character in ClickHouse, a quote is doubled. */
2
+ export function chString(value) {
3
+ return `'${value.replace(/\\/g, '\\\\').replace(/'/g, "''")}'`;
4
+ }
5
+ function simple(sql, kind, textual, comment) {
6
+ return {
7
+ sql,
8
+ kind,
9
+ nullable: true,
10
+ textual,
11
+ ...(comment === undefined ? {} : { comment }),
12
+ };
13
+ }
14
+ // ---------------------------------------------------------------------------
15
+ // Native types (Prisma `@db.*`)
16
+ // ---------------------------------------------------------------------------
17
+ const INTEGER_NATIVE = {
18
+ tinyint: 'Int8',
19
+ unsignedtinyint: 'UInt8',
20
+ smallint: 'Int16',
21
+ unsignedsmallint: 'UInt16',
22
+ mediumint: 'Int32',
23
+ unsignedmediumint: 'UInt32',
24
+ int: 'Int32',
25
+ integer: 'Int32',
26
+ unsignedint: 'UInt32',
27
+ oid: 'UInt32',
28
+ bigint: 'Int64',
29
+ unsignedbigint: 'UInt64',
30
+ year: 'UInt16',
31
+ };
32
+ const FLOAT_NATIVE = {
33
+ real: 'Float32',
34
+ float: 'Float32',
35
+ double: 'Float64',
36
+ doubleprecision: 'Float64',
37
+ };
38
+ function nativeType(field) {
39
+ const native = field.nativeType;
40
+ if (native === undefined) {
41
+ return undefined;
42
+ }
43
+ const name = native.name.toLowerCase();
44
+ const first = Number.parseInt(native.args[0] ?? '', 10);
45
+ switch (field.type) {
46
+ case 'int':
47
+ case 'bigInt': {
48
+ const sql = INTEGER_NATIVE[name];
49
+ return sql === undefined ? undefined : simple(sql, 'integer', false);
50
+ }
51
+ case 'float': {
52
+ const sql = FLOAT_NATIVE[name];
53
+ return sql === undefined ? undefined : simple(sql, 'float', false);
54
+ }
55
+ case 'string':
56
+ return (name === 'char' || name === 'nchar') &&
57
+ Number.isInteger(first) &&
58
+ first > 0
59
+ ? simple(`FixedString(${first})`, 'string', true)
60
+ : undefined;
61
+ default:
62
+ return undefined;
63
+ }
64
+ }
65
+ // ---------------------------------------------------------------------------
66
+ // Scalar types
67
+ // ---------------------------------------------------------------------------
68
+ function decimalType(context, label, field) {
69
+ const args = (field.nativeType?.args ?? [])
70
+ .map((arg) => Number.parseInt(arg, 10))
71
+ .filter((arg) => Number.isInteger(arg));
72
+ const given = field.maxDigits ?? args[0];
73
+ // Without a declared size, 38 digits (18 after the point) hold any realistic amount.
74
+ let precision = given ?? 38;
75
+ let scale = given === undefined ? 18 : (field.decimalPlaces ?? args[1] ?? 0);
76
+ if (precision > 76) {
77
+ context.warnings.push(`${label}: ClickHouse allows at most 76 digits in a Decimal; ${precision} was reduced to 76.`);
78
+ precision = 76;
79
+ }
80
+ if (precision < 1) {
81
+ precision = 1;
82
+ }
83
+ if (scale > precision) {
84
+ scale = precision;
85
+ }
86
+ return simple(`Decimal(${precision}, ${scale})`, 'decimal', false);
87
+ }
88
+ function dateTimeType(field) {
89
+ const precision = Number.parseInt(field.nativeType?.args[0] ?? '', 10);
90
+ const name = field.nativeType?.name.toLowerCase() ?? '';
91
+ const hasPrecision = /^(timestamp|timestamptz|datetime|datetime2)$/.test(name) &&
92
+ Number.isInteger(precision) &&
93
+ precision >= 0 &&
94
+ precision <= 9;
95
+ return simple(`DateTime64(${hasPrecision ? precision : 3})`, 'dateTime', true);
96
+ }
97
+ function enumType(context, label, definition) {
98
+ const values = definition.values;
99
+ if (values.length > 65_535) {
100
+ context.warnings.push(`${label}: enum ${definition.name} has more members than Enum16 holds; the column was written as LowCardinality(String).`);
101
+ return simple('LowCardinality(String)', 'string', true);
102
+ }
103
+ const members = values
104
+ .map((value, position) => `${chString(value.dbValue)} = ${position + 1}`)
105
+ .join(', ');
106
+ return simple(`${values.length > 127 ? 'Enum16' : 'Enum8'}(${members})`, 'enum', true);
107
+ }
108
+ function scalarType(context, label, field) {
109
+ if (field.enumName !== undefined) {
110
+ const definition = context.enums.get(field.enumName);
111
+ if (definition !== undefined) {
112
+ return enumType(context, label, definition);
113
+ }
114
+ context.warnings.push(`${label}: enum "${field.enumName}" does not exist in the schema (or has no values); the column was written as a plain string.`);
115
+ return simple('String', 'string', true);
116
+ }
117
+ const native = nativeType(field);
118
+ if (native !== undefined) {
119
+ return native;
120
+ }
121
+ switch (field.type) {
122
+ case 'string':
123
+ case 'text':
124
+ return simple('String', 'string', true);
125
+ case 'uuid':
126
+ return simple('UUID', 'uuid', true);
127
+ case 'int':
128
+ return simple('Int32', 'integer', false);
129
+ case 'bigInt':
130
+ return simple('Int64', 'integer', false);
131
+ case 'float':
132
+ return simple('Float64', 'float', false);
133
+ case 'decimal':
134
+ return decimalType(context, label, field);
135
+ case 'boolean':
136
+ return simple('Bool', 'bool', false);
137
+ case 'dateTime':
138
+ return dateTimeType(field);
139
+ case 'date':
140
+ return simple('Date32', 'date', true);
141
+ case 'time':
142
+ context.warnings.push(`${label}: ClickHouse has no stable time-of-day type; the column was written as a String ("HH:MM:SS").`);
143
+ return simple('String', 'string', true, 'time of day (HH:MM:SS)');
144
+ case 'json':
145
+ return simple('String', 'string', true, 'JSON document');
146
+ case 'bytes':
147
+ return simple('String', 'string', true, 'binary data');
148
+ case 'duration':
149
+ context.warnings.push(`${label}: ClickHouse has no interval column type; the duration was written as an Int64 (microseconds).`);
150
+ return simple('Int64', 'integer', false, 'duration in microseconds');
151
+ case 'ipAddress':
152
+ return simple('IPv6', 'ip', true);
153
+ case 'hstore':
154
+ return {
155
+ sql: 'Map(String, String)',
156
+ kind: 'map',
157
+ nullable: false,
158
+ textual: false,
159
+ };
160
+ case 'range':
161
+ context.warnings.push(`${label}: ClickHouse has no range type; the column was written as a String.`);
162
+ return simple('String', 'string', true, 'range stored as text');
163
+ case 'unsupported': {
164
+ const raw = field.unsupportedType;
165
+ if (raw !== undefined && raw !== '') {
166
+ context.warnings.push(`${label}: the database type "${raw}" (Prisma Unsupported) was written as it is; check that ClickHouse has it.`);
167
+ return simple(raw, 'other', false);
168
+ }
169
+ context.warnings.push(`${label}: the column has an unsupported database type that is unknown; it was written as a String.`);
170
+ return simple('String', 'string', true);
171
+ }
172
+ default:
173
+ context.warnings.push(`${label}: unknown field type "${String(field.type)}"; it was written as a String.`);
174
+ return simple('String', 'string', true);
175
+ }
176
+ }
177
+ /** The ClickHouse type of a field (an array field becomes nested `Array(...)`), without `Nullable`. */
178
+ export function clickhouseType(context, label, field) {
179
+ const element = scalarType(context, label, field);
180
+ const depth = field.arrayDepth ?? 0;
181
+ if (depth === 0) {
182
+ return element;
183
+ }
184
+ return {
185
+ sql: `${'Array('.repeat(depth)}${element.sql}${')'.repeat(depth)}`,
186
+ kind: 'array',
187
+ nullable: false,
188
+ textual: false,
189
+ ...(element.comment === undefined ? {} : { comment: element.comment }),
190
+ };
191
+ }
192
+ /** Wraps a type in `Nullable(...)` when the column is nullable and ClickHouse allows it. */
193
+ export function withNullability(type, nullable) {
194
+ return nullable && type.nullable ? `Nullable(${type.sql})` : type.sql;
195
+ }
196
+ // ---------------------------------------------------------------------------
197
+ // Defaults
198
+ // ---------------------------------------------------------------------------
199
+ const UUID_EXPRESSIONS = new Set([
200
+ 'gen_random_uuid()',
201
+ 'uuid_generate_v4()',
202
+ 'uuid()',
203
+ '(uuid())',
204
+ 'newid()',
205
+ 'newsequentialid()',
206
+ 'generateuuidv4()',
207
+ ]);
208
+ const NOW_EXPRESSIONS = new Set([
209
+ 'now()',
210
+ 'now64()',
211
+ 'now64(3)',
212
+ 'current_timestamp',
213
+ 'current_timestamp()',
214
+ 'current_timestamp(6)',
215
+ 'getdate()',
216
+ 'getutcdate()',
217
+ 'sysdatetime()',
218
+ 'sysutcdatetime()',
219
+ "datetime('now')",
220
+ ]);
221
+ const TODAY_EXPRESSIONS = new Set([
222
+ 'current_date',
223
+ 'current_date()',
224
+ 'today()',
225
+ '(current_date)',
226
+ ]);
227
+ /** `now64(p)` with the fractional digits of the column. */
228
+ function nowExpression(type) {
229
+ const precision = /^DateTime64\((\d)\)$/.exec(type.sql);
230
+ return `now64(${precision?.[1] ?? '3'})`;
231
+ }
232
+ export function enumMember(definition, raw) {
233
+ const value = definition?.values.find((candidate) => candidate.name === raw) ??
234
+ definition?.values.find((candidate) => candidate.dbValue === raw);
235
+ return value?.dbValue;
236
+ }
237
+ function arrayLiteral(value) {
238
+ if (Array.isArray(value)) {
239
+ const items = value.map(arrayLiteral);
240
+ return items.includes(undefined) ? undefined : `[${items.join(', ')}]`;
241
+ }
242
+ if (typeof value === 'string') {
243
+ return chString(value);
244
+ }
245
+ if (typeof value === 'number' || typeof value === 'boolean') {
246
+ return String(value);
247
+ }
248
+ return undefined;
249
+ }
250
+ function dateTimeLiteral(text) {
251
+ const iso = /^(\d{4}-\d{2}-\d{2})[T ](\d{2}:\d{2}:\d{2}(?:\.\d+)?)Z?$/.exec(text);
252
+ if (iso !== null) {
253
+ return `'${iso[1]} ${(iso[2] ?? '').replace(/\.0+$/, '')}'`;
254
+ }
255
+ return /^\d{4}-\d{2}-\d{2}$/.test(text) ? `'${text}'` : undefined;
256
+ }
257
+ function literalDefault(field, type, value) {
258
+ const text = String(value);
259
+ if (type.kind === 'array') {
260
+ try {
261
+ return arrayLiteral(JSON.parse(text));
262
+ }
263
+ catch {
264
+ return undefined;
265
+ }
266
+ }
267
+ switch (type.kind) {
268
+ case 'integer':
269
+ case 'float':
270
+ case 'decimal':
271
+ return Number.isFinite(Number(text)) && text.trim() !== ''
272
+ ? text.trim()
273
+ : undefined;
274
+ case 'bool':
275
+ if (/^(true|1)$/i.test(text)) {
276
+ return 'true';
277
+ }
278
+ return /^(false|0)$/i.test(text) ? 'false' : undefined;
279
+ case 'dateTime':
280
+ case 'date':
281
+ return dateTimeLiteral(text);
282
+ case 'map':
283
+ return undefined;
284
+ default:
285
+ return field.type === 'unsupported' ? undefined : chString(text);
286
+ }
287
+ }
288
+ /** The text after DEFAULT for a field, or a reason the default cannot be written. */
289
+ export function clickhouseDefault(context, label, field, type, value) {
290
+ switch (value.kind) {
291
+ case 'autoIncrement':
292
+ return {
293
+ dropped: 'ClickHouse has no auto-increment; the auto-increment was dropped',
294
+ };
295
+ case 'now':
296
+ if (field.type === 'dateTime') {
297
+ return { sql: nowExpression(type) };
298
+ }
299
+ if (field.type === 'date') {
300
+ return { sql: 'today()' };
301
+ }
302
+ return {
303
+ dropped: `a "now" default on a ${field.type} column cannot be written; the default was dropped`,
304
+ };
305
+ case 'uuid':
306
+ return field.type === 'uuid'
307
+ ? { sql: 'generateUUIDv4()' }
308
+ : {
309
+ dropped: `a UUID default on a ${field.type} column cannot be written; the default was dropped`,
310
+ };
311
+ case 'clientGenerated':
312
+ return {
313
+ dropped: `the ${value.generator}() default is generated by the ORM client, not the database; the default was dropped`,
314
+ };
315
+ case 'enumValue': {
316
+ const definition = field.enumName === undefined
317
+ ? undefined
318
+ : context.enums.get(field.enumName);
319
+ const stored = enumMember(definition, value.value);
320
+ if (type.kind === 'enum' && stored === undefined) {
321
+ return {
322
+ dropped: `the enum default "${value.value}" does not match a member of the enum; the default was dropped`,
323
+ };
324
+ }
325
+ return { sql: chString(stored ?? value.value) };
326
+ }
327
+ case 'dbExpression': {
328
+ if (value.isFunction === true) {
329
+ return {
330
+ dropped: `the ${value.expression} default function has no SQL equivalent; the default was dropped`,
331
+ };
332
+ }
333
+ const normalized = value.expression
334
+ .replace(/\s+/g, '')
335
+ .toLowerCase();
336
+ if (UUID_EXPRESSIONS.has(normalized) && field.type === 'uuid') {
337
+ return { sql: 'generateUUIDv4()' };
338
+ }
339
+ if (NOW_EXPRESSIONS.has(normalized) && field.type === 'dateTime') {
340
+ return { sql: nowExpression(type) };
341
+ }
342
+ if (TODAY_EXPRESSIONS.has(normalized) && field.type === 'date') {
343
+ return { sql: 'today()' };
344
+ }
345
+ context.warnings.push(`${label}: the database default expression ${value.expression} was written as it is; check that ClickHouse accepts it.`);
346
+ return { sql: value.expression.trim() };
347
+ }
348
+ case 'literal': {
349
+ const sql = literalDefault(field, type, value.value);
350
+ return sql === undefined
351
+ ? {
352
+ dropped: `the default ${String(value.value)} cannot be written as a ClickHouse ${type.sql} literal; the default was dropped`,
353
+ }
354
+ : { sql };
355
+ }
356
+ default:
357
+ return {};
358
+ }
359
+ }
360
+ //# sourceMappingURL=sqlClickhouseTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlClickhouseTypes.js","sourceRoot":"","sources":["../../src/emitters/sqlClickhouseTypes.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { IrSchema } from '../ir.js';
1
+ import type { IrEnum, IrField, IrModel, IrSchema } from '../ir.js';
2
2
  import { type NamingMode } from '../transforms.js';
3
3
  import type { EmitOutput, PrismaProvider } from './prisma.js';
4
4
  /**
@@ -26,4 +26,32 @@ export declare function sqlDialectOf(provider: PrismaProvider): SqlDialect;
26
26
  export declare function quoteIdentifier(dialect: SqlDialect, name: string): string;
27
27
  /** A string literal. MySQL also treats the backslash as an escape character. */
28
28
  export declare function sqlStringLiteral(dialect: SqlDialect, value: string): string;
29
+ export interface ResolvedTarget {
30
+ columnName: string;
31
+ /** The field that describes the referenced column's type. */
32
+ field: IrField;
33
+ }
34
+ interface EmitContext {
35
+ dialect: SqlDialect;
36
+ /** True for `--provider cockroachdb`: PostgreSQL syntax with CockroachDB's types and limits. */
37
+ cockroach: boolean;
38
+ schema: IrSchema;
39
+ warnings: string[];
40
+ enums: Map<string, ResolvedEnum>;
41
+ /** Constraint and index names already used (they share one namespace per schema in PostgreSQL). */
42
+ names: Set<string>;
43
+ /** Fields refreshed by the ORM on update that the dialect cannot express. */
44
+ unexpressedAutoUpdates: string[];
45
+ needsHstore: boolean;
46
+ /** CockroachDB: columns written as sequence-backed identity columns, reported in one warning. */
47
+ sequentialKeys: string[];
48
+ }
49
+ interface ResolvedEnum {
50
+ definition: IrEnum;
51
+ dbName: string;
52
+ }
29
53
  export declare function emitSqlDdl(schema: IrSchema, options: SqlDdlEmitOptions): EmitOutput;
54
+ /** Resolves the column a foreign key points at: `toField`, otherwise the target's single-column key. */
55
+ export declare function resolveTarget(context: Pick<EmitContext, 'schema'>, target: IrModel, toField: string | undefined, depth?: number): ResolvedTarget | undefined;
56
+ export declare function columnNameOf(model: IrModel, name: string): string | undefined;
57
+ export {};