@adminiumjs/schema-import 0.1.0-rc.1

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 (78) hide show
  1. package/LICENSE +661 -0
  2. package/dist/builder.d.ts +112 -0
  3. package/dist/builder.d.ts.map +1 -0
  4. package/dist/builder.js +291 -0
  5. package/dist/builder.js.map +1 -0
  6. package/dist/check-enum.d.ts +5 -0
  7. package/dist/check-enum.d.ts.map +1 -0
  8. package/dist/check-enum.js +40 -0
  9. package/dist/check-enum.js.map +1 -0
  10. package/dist/detect.d.ts +13 -0
  11. package/dist/detect.d.ts.map +1 -0
  12. package/dist/detect.js +47 -0
  13. package/dist/detect.js.map +1 -0
  14. package/dist/errors.d.ts +10 -0
  15. package/dist/errors.d.ts.map +1 -0
  16. package/dist/errors.js +12 -0
  17. package/dist/errors.js.map +1 -0
  18. package/dist/index.d.ts +14 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +14 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/parse.d.ts +3 -0
  23. package/dist/parse.d.ts.map +1 -0
  24. package/dist/parse.js +59 -0
  25. package/dist/parse.js.map +1 -0
  26. package/dist/parsers/django.d.ts +13 -0
  27. package/dist/parsers/django.d.ts.map +1 -0
  28. package/dist/parsers/django.js +489 -0
  29. package/dist/parsers/django.js.map +1 -0
  30. package/dist/parsers/drizzle.d.ts +13 -0
  31. package/dist/parsers/drizzle.d.ts.map +1 -0
  32. package/dist/parsers/drizzle.js +395 -0
  33. package/dist/parsers/drizzle.js.map +1 -0
  34. package/dist/parsers/json.d.ts +8 -0
  35. package/dist/parsers/json.d.ts.map +1 -0
  36. package/dist/parsers/json.js +31 -0
  37. package/dist/parsers/json.js.map +1 -0
  38. package/dist/parsers/prisma.d.ts +11 -0
  39. package/dist/parsers/prisma.d.ts.map +1 -0
  40. package/dist/parsers/prisma.js +402 -0
  41. package/dist/parsers/prisma.js.map +1 -0
  42. package/dist/parsers/rails.d.ts +13 -0
  43. package/dist/parsers/rails.d.ts.map +1 -0
  44. package/dist/parsers/rails.js +387 -0
  45. package/dist/parsers/rails.js.map +1 -0
  46. package/dist/parsers/sequelize.d.ts +12 -0
  47. package/dist/parsers/sequelize.d.ts.map +1 -0
  48. package/dist/parsers/sequelize.js +277 -0
  49. package/dist/parsers/sequelize.js.map +1 -0
  50. package/dist/parsers/sql-cursor.d.ts +40 -0
  51. package/dist/parsers/sql-cursor.d.ts.map +1 -0
  52. package/dist/parsers/sql-cursor.js +203 -0
  53. package/dist/parsers/sql-cursor.js.map +1 -0
  54. package/dist/parsers/sql.d.ts +17 -0
  55. package/dist/parsers/sql.d.ts.map +1 -0
  56. package/dist/parsers/sql.js +794 -0
  57. package/dist/parsers/sql.js.map +1 -0
  58. package/dist/parsers/typeorm.d.ts +13 -0
  59. package/dist/parsers/typeorm.d.ts.map +1 -0
  60. package/dist/parsers/typeorm.js +511 -0
  61. package/dist/parsers/typeorm.js.map +1 -0
  62. package/dist/text.d.ts +54 -0
  63. package/dist/text.d.ts.map +1 -0
  64. package/dist/text.js +254 -0
  65. package/dist/text.js.map +1 -0
  66. package/dist/type-map.d.ts +28 -0
  67. package/dist/type-map.d.ts.map +1 -0
  68. package/dist/type-map.js +171 -0
  69. package/dist/type-map.js.map +1 -0
  70. package/dist/types.d.ts +32 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +22 -0
  73. package/dist/types.js.map +1 -0
  74. package/dist/warnings.d.ts +17 -0
  75. package/dist/warnings.d.ts.map +1 -0
  76. package/dist/warnings.js +34 -0
  77. package/dist/warnings.js.map +1 -0
  78. package/package.json +29 -0
package/dist/text.d.ts ADDED
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Shared string-scanning primitives for the hand-rolled parsers. Everything
3
+ * here is dependency-free by design (05-introspection-engine.md §5: no ANTLR,
4
+ * no runtime `typescript` dependency — tokenizer level only).
5
+ */
6
+ export interface ScanOptions {
7
+ /** Recognize SQL `$tag$ ... $tag$` dollar quoting. */
8
+ dollarQuotes?: boolean;
9
+ /** Backslash escapes strings (JS/Python); SQL uses doubled quotes instead. */
10
+ backslashEscapes?: boolean;
11
+ /** Line-comment openers to skip, e.g. `['--']` (SQL), `['//']` (TS), `['#']` (Ruby/Python). */
12
+ lineComments?: readonly string[];
13
+ /** Skip block comments (slash-star … star-slash). */
14
+ blockComments?: boolean;
15
+ }
16
+ /**
17
+ * If `text[i]` begins a string or comment, return the index just past it;
18
+ * otherwise return `i`. The atom is never split, so callers can treat the
19
+ * whole literal/comment as opaque.
20
+ */
21
+ export declare function skipAtom(text: string, i: number, opts?: ScanOptions): number;
22
+ /** Split on `separator` at bracket depth 0, outside strings/comments. */
23
+ export declare function splitTopLevel(text: string, separator: string, opts?: ScanOptions): string[];
24
+ /**
25
+ * Given the index of an opening bracket, return the index of its matching
26
+ * closer (or -1). Strings/comments are skipped as atoms.
27
+ */
28
+ export declare function findBalanced(text: string, openIndex: number, opts?: ScanOptions): number;
29
+ /** Remove comments while preserving string literals verbatim. */
30
+ export declare function stripComments(text: string, opts: ScanOptions): string;
31
+ /** Strip `"x"`, `'x'`, `` `x` `` or `[x]` quoting from an identifier. */
32
+ export declare function unquoteIdent(raw: string): string;
33
+ /** If `raw` is a quoted string literal, return its contents; else null. */
34
+ export declare function stringLiteral(raw: string): string | null;
35
+ /** Collect all top-level quoted strings inside `text` (e.g. an args list). */
36
+ export declare function collectStrings(text: string, opts?: ScanOptions): string[];
37
+ export interface ArgList {
38
+ positional: string[];
39
+ /** Raw value expressions keyed by option name. */
40
+ named: Record<string, string>;
41
+ }
42
+ /**
43
+ * Parse a Ruby (`key: value`), Python (`key=value`) or JS-object
44
+ * (`key: value`) argument/option list into raw string values.
45
+ */
46
+ export declare function parseArgs(text: string, style: 'ruby' | 'python' | 'js'): ArgList;
47
+ /** `'x'`/`"x"` → string, `123`/`1.5` → number, true/false/True/False → boolean, else null. */
48
+ export declare function scalarValue(raw: string): string | number | boolean | null;
49
+ export declare function snakeCase(name: string): string;
50
+ /** Naive English pluralizer — enough for Rails `t.references` conventions. */
51
+ export declare function pluralize(word: string): string;
52
+ /** Naive inverse of {@link pluralize}. */
53
+ export declare function singularize(word: string): string;
54
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,+FAA+F;IAC/F,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,qDAAqD;IACrD,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAMD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,MAAM,CA2ChF;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,MAAM,EAAE,CAsB/F;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,MAAM,CAsB5F;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,CAwBrE;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAShD;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQxD;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,MAAM,EAAE,CAgB7E;AAED,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,GAAG,OAAO,CA2BhF;AAED,8FAA8F;AAC9F,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAQzE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM9C;AAED,8EAA8E;AAC9E,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI9C;AAED,0CAA0C;AAC1C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKhD"}
package/dist/text.js ADDED
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Shared string-scanning primitives for the hand-rolled parsers. Everything
3
+ * here is dependency-free by design (05-introspection-engine.md §5: no ANTLR,
4
+ * no runtime `typescript` dependency — tokenizer level only).
5
+ */
6
+ const OPENERS = { '(': ')', '[': ']', '{': '}' };
7
+ const CLOSERS = new Set([')', ']', '}']);
8
+ const QUOTES = new Set(["'", '"', '`']);
9
+ /**
10
+ * If `text[i]` begins a string or comment, return the index just past it;
11
+ * otherwise return `i`. The atom is never split, so callers can treat the
12
+ * whole literal/comment as opaque.
13
+ */
14
+ export function skipAtom(text, i, opts = {}) {
15
+ const ch = text[i];
16
+ if (ch === undefined)
17
+ return i;
18
+ for (const opener of opts.lineComments ?? []) {
19
+ if (text.startsWith(opener, i)) {
20
+ const nl = text.indexOf('\n', i);
21
+ return nl === -1 ? text.length : nl + 1;
22
+ }
23
+ }
24
+ if (opts.blockComments && text.startsWith('/*', i)) {
25
+ const end = text.indexOf('*/', i + 2);
26
+ return end === -1 ? text.length : end + 2;
27
+ }
28
+ if (opts.dollarQuotes && ch === '$') {
29
+ const m = /^\$[A-Za-z_][A-Za-z0-9_]*\$|^\$\$/.exec(text.slice(i));
30
+ if (m) {
31
+ const tag = m[0];
32
+ const end = text.indexOf(tag, i + tag.length);
33
+ return end === -1 ? text.length : end + tag.length;
34
+ }
35
+ }
36
+ if (QUOTES.has(ch)) {
37
+ let j = i + 1;
38
+ while (j < text.length) {
39
+ const c = text[j];
40
+ if (opts.backslashEscapes && c === '\\') {
41
+ j += 2;
42
+ continue;
43
+ }
44
+ if (c === ch) {
45
+ // SQL-style doubled quote escape ('' or "") — stay inside the literal.
46
+ if (!opts.backslashEscapes && text[j + 1] === ch) {
47
+ j += 2;
48
+ continue;
49
+ }
50
+ return j + 1;
51
+ }
52
+ j += 1;
53
+ }
54
+ return text.length;
55
+ }
56
+ return i;
57
+ }
58
+ /** Split on `separator` at bracket depth 0, outside strings/comments. */
59
+ export function splitTopLevel(text, separator, opts = {}) {
60
+ const parts = [];
61
+ let depth = 0;
62
+ let start = 0;
63
+ let i = 0;
64
+ while (i < text.length) {
65
+ const next = skipAtom(text, i, opts);
66
+ if (next !== i) {
67
+ i = next;
68
+ continue;
69
+ }
70
+ const ch = text[i];
71
+ if (OPENERS[ch] !== undefined)
72
+ depth += 1;
73
+ else if (CLOSERS.has(ch))
74
+ depth = Math.max(0, depth - 1);
75
+ else if (depth === 0 && ch === separator) {
76
+ parts.push(text.slice(start, i));
77
+ start = i + 1;
78
+ }
79
+ i += 1;
80
+ }
81
+ parts.push(text.slice(start));
82
+ return parts.map((p) => p.trim()).filter((p) => p.length > 0);
83
+ }
84
+ /**
85
+ * Given the index of an opening bracket, return the index of its matching
86
+ * closer (or -1). Strings/comments are skipped as atoms.
87
+ */
88
+ export function findBalanced(text, openIndex, opts = {}) {
89
+ const open = text[openIndex];
90
+ if (open === undefined || OPENERS[open] === undefined)
91
+ return -1;
92
+ const close = OPENERS[open];
93
+ let depth = 0;
94
+ let i = openIndex;
95
+ while (i < text.length) {
96
+ const next = skipAtom(text, i, opts);
97
+ if (next !== i) {
98
+ i = next;
99
+ continue;
100
+ }
101
+ const ch = text[i];
102
+ // Counting only the requested pair is sufficient for well-formed input.
103
+ if (ch === open)
104
+ depth += 1;
105
+ else if (ch === close) {
106
+ depth -= 1;
107
+ if (depth === 0)
108
+ return i;
109
+ }
110
+ i += 1;
111
+ }
112
+ return -1;
113
+ }
114
+ /** Remove comments while preserving string literals verbatim. */
115
+ export function stripComments(text, opts) {
116
+ let out = '';
117
+ let i = 0;
118
+ while (i < text.length) {
119
+ const ch = text[i];
120
+ const isComment = (opts.lineComments ?? []).some((c) => text.startsWith(c, i)) ||
121
+ (opts.blockComments === true && text.startsWith('/*', i));
122
+ const next = skipAtom(text, i, opts);
123
+ if (next !== i) {
124
+ if (isComment) {
125
+ // Keep the newline of line comments so line numbers survive.
126
+ const skipped = text.slice(i, next);
127
+ out += skipped.replace(/[^\n]/g, '');
128
+ }
129
+ else {
130
+ out += text.slice(i, next);
131
+ }
132
+ i = next;
133
+ continue;
134
+ }
135
+ out += ch;
136
+ i += 1;
137
+ }
138
+ return out;
139
+ }
140
+ /** Strip `"x"`, `'x'`, `` `x` `` or `[x]` quoting from an identifier. */
141
+ export function unquoteIdent(raw) {
142
+ const s = raw.trim();
143
+ const first = s[0];
144
+ const last = s[s.length - 1];
145
+ if (s.length >= 2 && first !== undefined && QUOTES.has(first) && last === first) {
146
+ return s.slice(1, -1).replaceAll(first + first, first);
147
+ }
148
+ if (s.length >= 2 && first === '[' && last === ']')
149
+ return s.slice(1, -1);
150
+ return s;
151
+ }
152
+ /** If `raw` is a quoted string literal, return its contents; else null. */
153
+ export function stringLiteral(raw) {
154
+ const s = raw.trim();
155
+ const first = s[0];
156
+ if (s.length >= 2 && first !== undefined && QUOTES.has(first) && s.endsWith(first)) {
157
+ const body = s.slice(1, -1);
158
+ return body.replaceAll('\\' + first, first).replaceAll(first + first, first);
159
+ }
160
+ return null;
161
+ }
162
+ /** Collect all top-level quoted strings inside `text` (e.g. an args list). */
163
+ export function collectStrings(text, opts = {}) {
164
+ const found = [];
165
+ let i = 0;
166
+ while (i < text.length) {
167
+ const ch = text[i];
168
+ if (QUOTES.has(ch)) {
169
+ const end = skipAtom(text, i, opts);
170
+ const lit = stringLiteral(text.slice(i, end));
171
+ if (lit !== null)
172
+ found.push(lit);
173
+ i = end;
174
+ continue;
175
+ }
176
+ const next = skipAtom(text, i, opts);
177
+ i = next === i ? i + 1 : next;
178
+ }
179
+ return found;
180
+ }
181
+ /**
182
+ * Parse a Ruby (`key: value`), Python (`key=value`) or JS-object
183
+ * (`key: value`) argument/option list into raw string values.
184
+ */
185
+ export function parseArgs(text, style) {
186
+ const opts = style === 'js'
187
+ ? { backslashEscapes: true, lineComments: ['//'], blockComments: true }
188
+ : { backslashEscapes: true, lineComments: ['#'] };
189
+ const positional = [];
190
+ const named = {};
191
+ for (const part of splitTopLevel(text, ',', opts)) {
192
+ let m = null;
193
+ if (style === 'python') {
194
+ m = /^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*([\s\S]+)$/.exec(part);
195
+ }
196
+ else {
197
+ // Ruby 1.9 hashes and JS object entries: `key:` / `"key":` / `'key':`.
198
+ m = /^(?:(?:"([^"]+)")|(?:'([^']+)')|([A-Za-z_$][A-Za-z0-9_$]*))\s*:\s*([\s\S]+)$/.exec(part);
199
+ }
200
+ if (m) {
201
+ if (style === 'python') {
202
+ named[m[1]] = m[2].trim();
203
+ }
204
+ else {
205
+ const key = (m[1] ?? m[2] ?? m[3]);
206
+ named[key] = m[4].trim();
207
+ }
208
+ }
209
+ else {
210
+ positional.push(part.trim());
211
+ }
212
+ }
213
+ return { positional, named };
214
+ }
215
+ /** `'x'`/`"x"` → string, `123`/`1.5` → number, true/false/True/False → boolean, else null. */
216
+ export function scalarValue(raw) {
217
+ const s = raw.trim();
218
+ const lit = stringLiteral(s);
219
+ if (lit !== null)
220
+ return lit;
221
+ if (/^-?\d+(\.\d+)?$/.test(s))
222
+ return Number(s);
223
+ if (/^(true|True)$/.test(s))
224
+ return true;
225
+ if (/^(false|False)$/.test(s))
226
+ return false;
227
+ return null;
228
+ }
229
+ export function snakeCase(name) {
230
+ return name
231
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')
232
+ .replace(/([a-z0-9])([A-Z])/g, '$1_$2')
233
+ .replaceAll('-', '_')
234
+ .toLowerCase();
235
+ }
236
+ /** Naive English pluralizer — enough for Rails `t.references` conventions. */
237
+ export function pluralize(word) {
238
+ if (/[^aeiou]y$/.test(word))
239
+ return word.slice(0, -1) + 'ies';
240
+ if (/(s|x|z|ch|sh)$/.test(word))
241
+ return word + 'es';
242
+ return word + 's';
243
+ }
244
+ /** Naive inverse of {@link pluralize}. */
245
+ export function singularize(word) {
246
+ if (/ies$/.test(word))
247
+ return word.slice(0, -3) + 'y';
248
+ if (/(ses|xes|zes|ches|shes)$/.test(word))
249
+ return word.slice(0, -2);
250
+ if (/s$/.test(word) && !/ss$/.test(word))
251
+ return word.slice(0, -1);
252
+ return word;
253
+ }
254
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Generic SQL-ish native type → LogicalType mapping (05 §2.2, "extend, never
3
+ * fork"). Covers Postgres, MySQL/MariaDB and SQLite spellings in one table
4
+ * because imported DDL is dialect-tolerant by design. TypeORM column `type`
5
+ * strings are the same vocabulary, so that parser reuses this too.
6
+ */
7
+ import type { ColumnDefault, LogicalType } from '@adminium/engine';
8
+ export interface MappedSqlType {
9
+ logicalType: LogicalType;
10
+ maxLength: number | null;
11
+ numericPrecision: number | null;
12
+ numericScale: number | null;
13
+ isArray: boolean;
14
+ }
15
+ /**
16
+ * Map a raw native type string (`varchar(120)`, `numeric(10,2)`,
17
+ * `timestamp(6) with time zone`, `text[]`, `tinyint(1)`) to its LogicalType
18
+ * plus extracted length/precision/scale.
19
+ */
20
+ export declare function mapSqlType(rawType: string): MappedSqlType;
21
+ /** True for pg serial pseudo-types and their implied autoincrement default. */
22
+ export declare function isSerialType(rawType: string): boolean;
23
+ /**
24
+ * Classify a raw SQL DEFAULT expression into the IR's ColumnDefault shape.
25
+ * Never returns `undefined` — anything unrecognized is an `expression`.
26
+ */
27
+ export declare function classifySqlDefault(rawExpr: string): ColumnDefault;
28
+ //# sourceMappingURL=type-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-map.d.ts","sourceRoot":"","sources":["../src/type-map.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAmFnE,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CA6CzD;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CA0BjE"}
@@ -0,0 +1,171 @@
1
+ const BASE_TYPE_MAP = {
2
+ // text
3
+ text: 'text',
4
+ tinytext: 'text',
5
+ mediumtext: 'text',
6
+ longtext: 'text',
7
+ citext: 'text',
8
+ clob: 'text',
9
+ string: 'text',
10
+ // varchar family
11
+ 'character varying': 'varchar',
12
+ varchar: 'varchar',
13
+ varchar2: 'varchar',
14
+ nvarchar: 'varchar',
15
+ character: 'varchar',
16
+ char: 'varchar',
17
+ nchar: 'varchar',
18
+ bpchar: 'varchar',
19
+ // integers
20
+ tinyint: 'integer',
21
+ smallint: 'integer',
22
+ mediumint: 'integer',
23
+ int: 'integer',
24
+ integer: 'integer',
25
+ int2: 'integer',
26
+ int4: 'integer',
27
+ serial: 'integer',
28
+ smallserial: 'integer',
29
+ year: 'integer',
30
+ bigint: 'bigint',
31
+ int8: 'bigint',
32
+ bigserial: 'bigint',
33
+ // numerics
34
+ numeric: 'decimal',
35
+ decimal: 'decimal',
36
+ dec: 'decimal',
37
+ money: 'decimal',
38
+ real: 'float',
39
+ float: 'float',
40
+ float4: 'float',
41
+ float8: 'float',
42
+ double: 'float',
43
+ 'double precision': 'float',
44
+ // booleans
45
+ boolean: 'boolean',
46
+ bool: 'boolean',
47
+ // date/time
48
+ date: 'date',
49
+ time: 'time',
50
+ timetz: 'time',
51
+ 'time with time zone': 'time',
52
+ 'time without time zone': 'time',
53
+ timestamp: 'timestamp',
54
+ 'timestamp without time zone': 'timestamp',
55
+ datetime: 'timestamp',
56
+ datetime2: 'timestamp',
57
+ 'timestamp with time zone': 'timestamptz',
58
+ timestamptz: 'timestamptz',
59
+ interval: 'interval',
60
+ // structured / misc
61
+ uuid: 'uuid',
62
+ json: 'json',
63
+ jsonb: 'json',
64
+ xml: 'text',
65
+ bytea: 'binary',
66
+ blob: 'binary',
67
+ tinyblob: 'binary',
68
+ mediumblob: 'binary',
69
+ longblob: 'binary',
70
+ binary: 'binary',
71
+ varbinary: 'binary',
72
+ bit: 'binary',
73
+ enum: 'enum',
74
+ inet: 'inet',
75
+ cidr: 'inet',
76
+ macaddr: 'inet',
77
+ geometry: 'geometry',
78
+ geography: 'geometry',
79
+ point: 'geometry',
80
+ };
81
+ /**
82
+ * Map a raw native type string (`varchar(120)`, `numeric(10,2)`,
83
+ * `timestamp(6) with time zone`, `text[]`, `tinyint(1)`) to its LogicalType
84
+ * plus extracted length/precision/scale.
85
+ */
86
+ export function mapSqlType(rawType) {
87
+ let raw = rawType.trim();
88
+ let isArray = false;
89
+ while (raw.endsWith('[]')) {
90
+ isArray = true;
91
+ raw = raw.slice(0, -2).trim();
92
+ }
93
+ if (/\barray\b\s*$/i.test(raw)) {
94
+ isArray = true;
95
+ raw = raw.replace(/\barray\b\s*$/i, '').trim();
96
+ }
97
+ const argsMatch = /^([^(]+)\(([^)]*)\)(.*)$/.exec(raw);
98
+ const base = (argsMatch ? `${argsMatch[1]} ${argsMatch[3] ?? ''}` : raw)
99
+ .replace(/\s+/g, ' ')
100
+ .trim()
101
+ .toLowerCase()
102
+ // 'unsigned'/'zerofill' are mysql noise for mapping purposes
103
+ .replace(/\b(unsigned|zerofill)\b/g, '')
104
+ .trim();
105
+ const args = (argsMatch?.[2] ?? '')
106
+ .split(',')
107
+ .map((a) => Number.parseInt(a.trim(), 10))
108
+ .filter((n) => Number.isFinite(n));
109
+ // mysql2 convention: tinyint(1) is a boolean.
110
+ if (base === 'tinyint' && args[0] === 1) {
111
+ return { logicalType: 'boolean', maxLength: null, numericPrecision: null, numericScale: null, isArray };
112
+ }
113
+ const logicalType = BASE_TYPE_MAP[base] ?? 'unknown';
114
+ const out = {
115
+ logicalType,
116
+ maxLength: null,
117
+ numericPrecision: null,
118
+ numericScale: null,
119
+ isArray,
120
+ };
121
+ if (logicalType === 'varchar' || logicalType === 'text' || logicalType === 'binary') {
122
+ out.maxLength = args[0] ?? null;
123
+ }
124
+ else if (logicalType === 'decimal' || logicalType === 'float') {
125
+ out.numericPrecision = args[0] ?? null;
126
+ out.numericScale = args[1] ?? null;
127
+ }
128
+ return out;
129
+ }
130
+ /** True for pg serial pseudo-types and their implied autoincrement default. */
131
+ export function isSerialType(rawType) {
132
+ return /^(small|big)?serial\b/i.test(rawType.trim());
133
+ }
134
+ /**
135
+ * Classify a raw SQL DEFAULT expression into the IR's ColumnDefault shape.
136
+ * Never returns `undefined` — anything unrecognized is an `expression`.
137
+ */
138
+ export function classifySqlDefault(rawExpr) {
139
+ let expr = rawExpr.trim();
140
+ if (expr.length === 0)
141
+ return null;
142
+ // pg_dump loves casts: 'draft'::character varying
143
+ const castStripped = expr.replace(/::[a-zA-Z_][a-zA-Z0-9_ ]*(\[\])?/g, '').trim();
144
+ expr = castStripped.length > 0 ? castStripped : expr;
145
+ // strip one layer of wrapping parens
146
+ while (expr.startsWith('(') && expr.endsWith(')')) {
147
+ const inner = expr.slice(1, -1).trim();
148
+ if (inner.length === 0)
149
+ break;
150
+ expr = inner;
151
+ }
152
+ if (/^nextval\s*\(/i.test(expr))
153
+ return { kind: 'autoincrement' };
154
+ if (/^(now\s*\(\s*\)|current_timestamp(\s*\(\d*\))?|current_date|current_time|getdate\s*\(\s*\)|transaction_timestamp\s*\(\s*\)|statement_timestamp\s*\(\s*\))$/i.test(expr)) {
155
+ return { kind: 'now' };
156
+ }
157
+ if (/^(gen_random_uuid|uuid_generate_v[14]|uuid)\s*\(\s*\)$/i.test(expr))
158
+ return { kind: 'uuid' };
159
+ if (/^null$/i.test(expr))
160
+ return null;
161
+ if (/^(true|false)$/i.test(expr))
162
+ return { kind: 'literal', text: expr.toLowerCase() };
163
+ if (/^-?\d+(\.\d+)?$/.test(expr))
164
+ return { kind: 'literal', text: expr };
165
+ const first = expr[0];
166
+ if ((first === "'" || first === '"') && expr.endsWith(first) && expr.length >= 2) {
167
+ return { kind: 'literal', text: expr.slice(1, -1).replaceAll(first + first, first) };
168
+ }
169
+ return { kind: 'expression', text: expr };
170
+ }
171
+ //# sourceMappingURL=type-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-map.js","sourceRoot":"","sources":["../src/type-map.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Public types for @adminium/schema-import — 05-introspection-engine.md §5.
3
+ *
4
+ * The short `Format` names are the user-facing vocabulary of the import
5
+ * wizard and the `/api/v1/schema-import/parse` route; they map 1:1 onto the
6
+ * engine's `ImportFormat` enum (which persists inside `model.source`).
7
+ */
8
+ import type { DatabaseModel, ImportFormat } from '@adminium/engine';
9
+ export declare const FORMATS: readonly ["sql", "prisma", "drizzle", "typeorm", "sequelize", "rails", "django", "json"];
10
+ export type Format = (typeof FORMATS)[number];
11
+ /** Short public format name → engine `ImportFormat` (stored in `model.source`). */
12
+ export declare const FORMAT_TO_IR: Readonly<Record<Format, ImportFormat>>;
13
+ export interface ParseSchemaFileOptions {
14
+ /** Skip auto-detection and parse as this format. */
15
+ format?: Format;
16
+ /** Model name override (defaults to `<format>-import`). */
17
+ name?: string;
18
+ /** Original file name — recorded on `model.source.fileName` for provenance. */
19
+ fileName?: string;
20
+ }
21
+ export interface ParseSchemaFileResult {
22
+ model: DatabaseModel;
23
+ /** The format actually used (detected or forced). */
24
+ format: Format;
25
+ /**
26
+ * Human-readable non-fatal issues (skipped statements, unsupported
27
+ * constructs, dropped dangling references). Mirrored into
28
+ * `model.warnings` with stable codes.
29
+ */
30
+ warnings: string[];
31
+ }
32
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEpE,eAAO,MAAM,OAAO,0FASV,CAAC;AACX,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9C,mFAAmF;AACnF,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAS/D,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,aAAa,CAAC;IACrB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB"}
package/dist/types.js ADDED
@@ -0,0 +1,22 @@
1
+ export const FORMATS = [
2
+ 'sql',
3
+ 'prisma',
4
+ 'drizzle',
5
+ 'typeorm',
6
+ 'sequelize',
7
+ 'rails',
8
+ 'django',
9
+ 'json',
10
+ ];
11
+ /** Short public format name → engine `ImportFormat` (stored in `model.source`). */
12
+ export const FORMAT_TO_IR = {
13
+ sql: 'sql-ddl',
14
+ prisma: 'prisma',
15
+ drizzle: 'drizzle',
16
+ typeorm: 'typeorm',
17
+ sequelize: 'sequelize',
18
+ rails: 'rails',
19
+ django: 'django',
20
+ json: 'json-ir',
21
+ };
22
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,KAAK;IACL,QAAQ;IACR,SAAS;IACT,SAAS;IACT,WAAW;IACX,OAAO;IACP,QAAQ;IACR,MAAM;CACE,CAAC;AAGX,mFAAmF;AACnF,MAAM,CAAC,MAAM,YAAY,GAA2C;IAClE,GAAG,EAAE,SAAS;IACd,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,SAAS;CAChB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { ModelWarning } from '@adminium/engine';
2
+ /**
3
+ * Warning collector shared by every parser. Parsers must NEVER throw on an
4
+ * unsupported construct inside an otherwise-parseable file — they record a
5
+ * warning here and move on. `addCount` aggregates high-volume skips (INSERT
6
+ * statements in a dump, unknown builder methods) into one warning per kind.
7
+ */
8
+ export declare class WarningList {
9
+ private readonly items;
10
+ private readonly counts;
11
+ add(code: string, message: string, tableId?: string | null): void;
12
+ /** Aggregate repeated skips: one warning per (code,label) with a count. */
13
+ addCount(code: string, label: string): void;
14
+ toModelWarnings(): ModelWarning[];
15
+ messages(): string[];
16
+ }
17
+ //# sourceMappingURL=warnings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warnings.d.ts","sourceRoot":"","sources":["../src/warnings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;;;GAKG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqE;IAE5F,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,GAAG,IAAW,GAAG,IAAI;IAIvE,2EAA2E;IAC3E,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAO3C,eAAe,IAAI,YAAY,EAAE;IASjC,QAAQ,IAAI,MAAM,EAAE;CAGrB"}