@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
@@ -0,0 +1,277 @@
1
+ import { ModelBuilder } from '../builder.js';
2
+ import { SchemaImportError } from '../errors.js';
3
+ import { collectStrings, findBalanced, parseArgs, splitTopLevel, stringLiteral, stripComments } from '../text.js';
4
+ const JS_SCAN = { backslashEscapes: true, lineComments: ['//'], blockComments: true };
5
+ const DATA_TYPES = {
6
+ STRING: { logicalType: 'varchar', dbType: 'varchar(255)' },
7
+ CHAR: { logicalType: 'varchar', dbType: 'char' },
8
+ TEXT: { logicalType: 'text', dbType: 'text' },
9
+ CITEXT: { logicalType: 'text', dbType: 'citext' },
10
+ TINYINT: { logicalType: 'integer', dbType: 'tinyint' },
11
+ SMALLINT: { logicalType: 'integer', dbType: 'smallint' },
12
+ MEDIUMINT: { logicalType: 'integer', dbType: 'mediumint' },
13
+ INTEGER: { logicalType: 'integer', dbType: 'integer' },
14
+ BIGINT: { logicalType: 'bigint', dbType: 'bigint' },
15
+ FLOAT: { logicalType: 'float', dbType: 'float' },
16
+ REAL: { logicalType: 'float', dbType: 'real' },
17
+ DOUBLE: { logicalType: 'float', dbType: 'double' },
18
+ DECIMAL: { logicalType: 'decimal', dbType: 'decimal' },
19
+ NUMERIC: { logicalType: 'decimal', dbType: 'numeric' },
20
+ BOOLEAN: { logicalType: 'boolean', dbType: 'boolean' },
21
+ DATE: { logicalType: 'timestamptz', dbType: 'timestamp with time zone' },
22
+ DATEONLY: { logicalType: 'date', dbType: 'date' },
23
+ TIME: { logicalType: 'time', dbType: 'time' },
24
+ NOW: { logicalType: 'timestamp', dbType: 'timestamp' },
25
+ UUID: { logicalType: 'uuid', dbType: 'uuid' },
26
+ JSON: { logicalType: 'json', dbType: 'json' },
27
+ JSONB: { logicalType: 'json', dbType: 'jsonb' },
28
+ BLOB: { logicalType: 'binary', dbType: 'blob' },
29
+ ENUM: { logicalType: 'enum', dbType: 'enum' },
30
+ GEOMETRY: { logicalType: 'geometry', dbType: 'geometry' },
31
+ INET: { logicalType: 'inet', dbType: 'inet' },
32
+ };
33
+ export function parseSequelize(content, name, warnings) {
34
+ const source = stripComments(content, JS_SCAN);
35
+ const sites = [];
36
+ // Form 1: sequelize.define('user', {…}, {…})
37
+ const defineRe = /\bsequelize\.define\s*\(/g;
38
+ let m;
39
+ while ((m = defineRe.exec(source)) !== null) {
40
+ const open = m.index + m[0].length - 1;
41
+ const close = findBalanced(source, open, JS_SCAN);
42
+ if (close === -1)
43
+ continue;
44
+ const args = splitTopLevel(source.slice(open + 1, close), ',', JS_SCAN);
45
+ const modelName = stringLiteral(args[0] ?? '');
46
+ const attrs = args.find((a) => a.trimStart().startsWith('{'));
47
+ if (modelName === null || attrs === undefined) {
48
+ warnings.add('dynamic-name', 'sequelize.define with a non-literal name or attributes skipped');
49
+ continue;
50
+ }
51
+ const options = args.slice(args.indexOf(attrs) + 1).find((a) => a.trimStart().startsWith('{')) ?? null;
52
+ sites.push({ modelName, attrsObject: attrs, optionsObject: options });
53
+ defineRe.lastIndex = close + 1;
54
+ }
55
+ // Form 2: class User extends Model {…}; User.init({…}, {…})
56
+ const initRe = /\b([A-Za-z_$][\w$]*)\.init\s*\(/g;
57
+ while ((m = initRe.exec(source)) !== null) {
58
+ const className = m[1];
59
+ if (className === 'Model')
60
+ continue;
61
+ const open = m.index + m[0].length - 1;
62
+ const close = findBalanced(source, open, JS_SCAN);
63
+ if (close === -1)
64
+ continue;
65
+ const args = splitTopLevel(source.slice(open + 1, close), ',', JS_SCAN);
66
+ const attrs = args.find((a) => a.trimStart().startsWith('{'));
67
+ if (attrs === undefined)
68
+ continue;
69
+ const options = args.slice(args.indexOf(attrs) + 1).find((a) => a.trimStart().startsWith('{')) ?? null;
70
+ sites.push({ modelName: className, attrsObject: attrs, optionsObject: options });
71
+ initRe.lastIndex = close + 1;
72
+ }
73
+ if (sites.length === 0) {
74
+ throw new SchemaImportError('no sequelize.define() calls or Model.init() classes found');
75
+ }
76
+ const builder = new ModelBuilder(warnings);
77
+ /** model name (define name or class name) → table name, for `references: {model: Users}` */
78
+ const modelToTable = new Map();
79
+ for (const site of sites) {
80
+ const options = site.optionsObject !== null ? parseArgs(stripObj(site.optionsObject), 'js').named : {};
81
+ const tableName = stringLiteral(options['tableName'] ?? '') ?? site.modelName;
82
+ if (stringLiteral(options['tableName'] ?? '') === null) {
83
+ warnings.add('naming-assumed', `model "${site.modelName}" has no tableName option; name taken verbatim (Sequelize would pluralize at runtime)`);
84
+ }
85
+ modelToTable.set(site.modelName, tableName);
86
+ const modelNameOpt = stringLiteral(options['modelName'] ?? '');
87
+ if (modelNameOpt !== null)
88
+ modelToTable.set(modelNameOpt, tableName);
89
+ const table = builder.addTable({ name: tableName });
90
+ const underscored = options['underscored'] === 'true';
91
+ for (const entry of splitTopLevel(stripObj(site.attrsObject), ',', JS_SCAN)) {
92
+ const kv = /^([A-Za-z_$][\w$]*|"[^"]+"|'[^']+')\s*:\s*([\s\S]+)$/.exec(entry.trim());
93
+ if (!kv)
94
+ continue;
95
+ const attrName = stringLiteral(kv[1]) ?? kv[1];
96
+ const col = parseAttribute(attrName, kv[2].trim(), table, builder, warnings);
97
+ if (col)
98
+ table.columns.push(col);
99
+ }
100
+ if (options['timestamps'] === 'true') {
101
+ const createdAt = underscored ? 'created_at' : 'createdAt';
102
+ const updatedAt = underscored ? 'updated_at' : 'updatedAt';
103
+ for (const colName of [createdAt, updatedAt]) {
104
+ if (!table.columns.some((c) => c.name === colName)) {
105
+ table.columns.push({
106
+ name: colName,
107
+ dbType: 'timestamp with time zone',
108
+ logicalType: 'timestamptz',
109
+ nullable: false,
110
+ });
111
+ }
112
+ }
113
+ }
114
+ }
115
+ // `references: { model: 'users' | Users }` may name a model — remap.
116
+ for (const table of builder.allTables()) {
117
+ for (const col of table.columns) {
118
+ if (col.references != null && builder.getTable(col.references.table) === undefined) {
119
+ const remapped = modelToTable.get(col.references.table);
120
+ if (remapped !== undefined)
121
+ col.references = { ...col.references, table: remapped };
122
+ }
123
+ }
124
+ }
125
+ if (/\.(belongsTo|hasMany|hasOne|belongsToMany)\s*\(/.test(source)) {
126
+ warnings.add('skipped-associations', 'association calls (belongsTo/hasMany/hasOne/belongsToMany) are not imported; declare references in attributes');
127
+ }
128
+ return builder.finalize({
129
+ format: 'sequelize',
130
+ dialect: 'generic',
131
+ name,
132
+ capabilities: { hasEnums: true, hasFKs: true, hasComments: true, hasChecks: false, hasSchemas: false },
133
+ });
134
+ }
135
+ function stripObj(objectLiteral) {
136
+ const s = objectLiteral.trim();
137
+ return s.startsWith('{') && s.endsWith('}') ? s.slice(1, -1) : s;
138
+ }
139
+ function parseAttribute(attrName, valueExpr, table, builder, warnings) {
140
+ // Shorthand: `name: DataTypes.STRING`
141
+ if (!valueExpr.startsWith('{')) {
142
+ const typed = applyDataType(valueExpr, { name: attrName }, table, builder);
143
+ if (!typed) {
144
+ warnings.addCount('unknown-type', `skipped attribute with unrecognized type expression`);
145
+ return null;
146
+ }
147
+ return typed;
148
+ }
149
+ const opts = parseArgs(stripObj(valueExpr), 'js').named;
150
+ const columnName = stringLiteral(opts['field'] ?? '') ?? attrName;
151
+ let col = { name: columnName };
152
+ if (opts['type'] !== undefined) {
153
+ const typed = applyDataType(opts['type'], col, table, builder);
154
+ if (typed)
155
+ col = typed;
156
+ else {
157
+ warnings.addCount('unknown-type', 'attribute type expression not recognized; mapped to unknown');
158
+ col.dbType = opts['type'];
159
+ col.logicalType = 'unknown';
160
+ }
161
+ }
162
+ if (opts['allowNull'] !== undefined)
163
+ col.nullable = opts['allowNull'] === 'true';
164
+ if (opts['primaryKey'] === 'true') {
165
+ col.isPrimaryKey = true;
166
+ col.nullable = false;
167
+ }
168
+ if (opts['unique'] !== undefined && opts['unique'] !== 'false')
169
+ col.isUnique = true;
170
+ if (opts['autoIncrement'] === 'true')
171
+ col.default = { kind: 'autoincrement' };
172
+ if (opts['comment'] !== undefined)
173
+ col.comment = stringLiteral(opts['comment']);
174
+ if (opts['defaultValue'] !== undefined && col.default === undefined) {
175
+ col.default = classifySequelizeDefault(opts['defaultValue']);
176
+ }
177
+ const refs = opts['references'];
178
+ if (refs !== undefined && refs.trimStart().startsWith('{')) {
179
+ const refOpts = parseArgs(stripObj(refs), 'js').named;
180
+ const model = stringLiteral(refOpts['model'] ?? '') ?? refOpts['model'];
181
+ const key = stringLiteral(refOpts['key'] ?? '');
182
+ if (model !== undefined && model.length > 0) {
183
+ col.references = {
184
+ table: model,
185
+ column: key ?? undefined,
186
+ onDelete: fkAction(opts['onDelete']),
187
+ onUpdate: fkAction(opts['onUpdate']),
188
+ };
189
+ }
190
+ }
191
+ return col;
192
+ }
193
+ /** Interpret a `DataTypes.X(...)` (or `Sequelize.X`) expression onto a column draft. */
194
+ function applyDataType(expr, col, table, builder) {
195
+ const m = /^(?:DataTypes|Sequelize)\.([A-Z]+[A-Z0-9_]*)(?:\s*\(([\s\S]*?)\))?/.exec(expr.trim());
196
+ if (!m)
197
+ return null;
198
+ const typeName = m[1];
199
+ const args = m[2] ?? '';
200
+ if (typeName === 'UUIDV4' || typeName === 'UUIDV1') {
201
+ col.dbType = 'uuid';
202
+ col.logicalType = 'uuid';
203
+ return col;
204
+ }
205
+ const known = DATA_TYPES[typeName];
206
+ if (known === undefined)
207
+ return null;
208
+ col.dbType = known.dbType;
209
+ col.logicalType = known.logicalType;
210
+ if (typeName === 'ENUM') {
211
+ const values = collectStrings(args, JS_SCAN);
212
+ if (values.length > 0) {
213
+ const id = `public.${table.name}.${col.name}`;
214
+ builder.addEnum({ id, name: col.name, values, source: 'column-type' });
215
+ col.enumRef = id;
216
+ col.dbType = `enum(${values.map((v) => `'${v}'`).join(',')})`;
217
+ }
218
+ else {
219
+ col.logicalType = 'text';
220
+ }
221
+ return col;
222
+ }
223
+ const nums = args
224
+ .split(',')
225
+ .map((a) => Number.parseInt(a.trim(), 10))
226
+ .filter((n) => Number.isFinite(n));
227
+ if (typeName === 'STRING' || typeName === 'CHAR') {
228
+ col.maxLength = nums[0] ?? 255;
229
+ col.dbType = `varchar(${col.maxLength})`;
230
+ }
231
+ else if (typeName === 'DECIMAL' || typeName === 'NUMERIC' || typeName === 'FLOAT' || typeName === 'DOUBLE') {
232
+ col.numericPrecision = nums[0] ?? null;
233
+ col.numericScale = nums[1] ?? null;
234
+ }
235
+ return col;
236
+ }
237
+ function classifySequelizeDefault(raw) {
238
+ const arg = raw.trim();
239
+ if (/^(?:DataTypes|Sequelize)\.NOW$/.test(arg))
240
+ return { kind: 'now' };
241
+ if (/^(?:DataTypes|Sequelize)\.UUIDV[14]$/.test(arg))
242
+ return { kind: 'uuid' };
243
+ const literalFn = /^(?:Sequelize|sequelize)\.(?:literal|fn)\s*\(([\s\S]*)\)$/.exec(arg);
244
+ if (literalFn) {
245
+ const inner = stringLiteral(splitTopLevel(literalFn[1], ',', JS_SCAN)[0] ?? '') ?? literalFn[1];
246
+ if (/current_timestamp|now\(\)/i.test(inner))
247
+ return { kind: 'now' };
248
+ return { kind: 'expression', text: inner };
249
+ }
250
+ const str = stringLiteral(arg);
251
+ if (str !== null)
252
+ return { kind: 'literal', text: str };
253
+ if (/^-?\d+(\.\d+)?$/.test(arg) || arg === 'true' || arg === 'false') {
254
+ return { kind: 'literal', text: arg };
255
+ }
256
+ if (arg === 'null')
257
+ return null;
258
+ return { kind: 'expression', text: arg };
259
+ }
260
+ function fkAction(raw) {
261
+ const value = raw === undefined ? null : stringLiteral(raw)?.toUpperCase() ?? null;
262
+ switch (value) {
263
+ case 'CASCADE':
264
+ return 'cascade';
265
+ case 'RESTRICT':
266
+ return 'restrict';
267
+ case 'SET NULL':
268
+ return 'set-null';
269
+ case 'SET DEFAULT':
270
+ return 'set-default';
271
+ case 'NO ACTION':
272
+ return 'no-action';
273
+ default:
274
+ return null;
275
+ }
276
+ }
277
+ //# sourceMappingURL=sequelize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequelize.js","sourceRoot":"","sources":["../../src/parsers/sequelize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ export declare class SqlCursor {
2
+ private readonly text;
3
+ private pos;
4
+ constructor(text: string);
5
+ private skipWs;
6
+ eof(): boolean;
7
+ /** Current position (for raw-slice captures). */
8
+ save(): number;
9
+ /** Raw text between a saved position and the current one. */
10
+ textFrom(start: number): string;
11
+ /** Consume a numeric literal; returns raw text or null. */
12
+ tryNumber(): string | null;
13
+ rest(): string;
14
+ /** Peek the next bare word, uppercased (null when next token is not a word). */
15
+ peekWord(): string | null;
16
+ /** Consume and return the next bare word (uppercased), or null. */
17
+ takeWord(): string | null;
18
+ /** Consume the given word sequence if (case-insensitively) present. */
19
+ tryWords(...words: string[]): boolean;
20
+ /** Consume one punctuation char if it matches. */
21
+ tryChar(ch: string): boolean;
22
+ /**
23
+ * Consume an identifier: quoted ("x" / `x` / [x]) or bare word. Returns the
24
+ * unquoted spelling (bare identifiers keep their original case — imports
25
+ * preserve author casing). Null when the next token is not an identifier.
26
+ */
27
+ takeIdentifier(): string | null;
28
+ /** Consume a possibly schema-qualified identifier → parts. */
29
+ takeQualifiedIdentifier(): string[] | null;
30
+ /** If next token is `(`, consume the balanced group and return its inner text. */
31
+ takeParenGroup(): string | null;
32
+ /** Consume a '...' string literal (with '' escapes); null otherwise. */
33
+ takeStringLiteral(): string | null;
34
+ /**
35
+ * Capture raw text until one of `stopWords` appears at paren depth 0 (or
36
+ * end of input). Used for DEFAULT expressions and type tails.
37
+ */
38
+ takeUntilWords(stopWords: readonly string[]): string;
39
+ }
40
+ //# sourceMappingURL=sql-cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-cursor.d.ts","sourceRoot":"","sources":["../../src/parsers/sql-cursor.ts"],"names":[],"mappings":"AAUA,qBAAa,SAAS;IAGR,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,GAAG,CAAK;gBAEa,IAAI,EAAE,MAAM;IAEzC,OAAO,CAAC,MAAM;IAId,GAAG,IAAI,OAAO;IAKd,iDAAiD;IACjD,IAAI,IAAI,MAAM;IAKd,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI/B,2DAA2D;IAC3D,SAAS,IAAI,MAAM,GAAG,IAAI;IAQ1B,IAAI,IAAI,MAAM;IAKd,gFAAgF;IAChF,QAAQ,IAAI,MAAM,GAAG,IAAI;IAMzB,mEAAmE;IACnE,QAAQ,IAAI,MAAM,GAAG,IAAI;IAQzB,uEAAuE;IACvE,QAAQ,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;IAWrC,kDAAkD;IAClD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAS5B;;;;OAIG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IA0B/B,8DAA8D;IAC9D,uBAAuB,IAAI,MAAM,EAAE,GAAG,IAAI;IAY1C,kFAAkF;IAClF,cAAc,IAAI,MAAM,GAAG,IAAI;IAc/B,wEAAwE;IACxE,iBAAiB,IAAI,MAAM,GAAG,IAAI;IAsBlC;;;OAGG;IACH,cAAc,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM;CAiCrD"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Tiny token cursor over a single SQL statement (comments already stripped).
3
+ * Understands quoted identifiers ("x", `x`, [x]), string literals ('x' with
4
+ * '' escapes) and balanced paren groups — the only shapes the DDL
5
+ * mini-parsers need.
6
+ */
7
+ import { findBalanced, unquoteIdent } from '../text.js';
8
+ const WORD_RE = /^[A-Za-z_][A-Za-z0-9_$]*/;
9
+ export class SqlCursor {
10
+ text;
11
+ pos = 0;
12
+ constructor(text) {
13
+ this.text = text;
14
+ }
15
+ skipWs() {
16
+ while (this.pos < this.text.length && /\s/.test(this.text[this.pos]))
17
+ this.pos += 1;
18
+ }
19
+ eof() {
20
+ this.skipWs();
21
+ return this.pos >= this.text.length;
22
+ }
23
+ /** Current position (for raw-slice captures). */
24
+ save() {
25
+ this.skipWs();
26
+ return this.pos;
27
+ }
28
+ /** Raw text between a saved position and the current one. */
29
+ textFrom(start) {
30
+ return this.text.slice(start, this.pos).trim();
31
+ }
32
+ /** Consume a numeric literal; returns raw text or null. */
33
+ tryNumber() {
34
+ this.skipWs();
35
+ const m = /^-?\d+(\.\d+)?([eE][+-]?\d+)?/.exec(this.text.slice(this.pos));
36
+ if (!m)
37
+ return null;
38
+ this.pos += m[0].length;
39
+ return m[0];
40
+ }
41
+ rest() {
42
+ this.skipWs();
43
+ return this.text.slice(this.pos);
44
+ }
45
+ /** Peek the next bare word, uppercased (null when next token is not a word). */
46
+ peekWord() {
47
+ this.skipWs();
48
+ const m = WORD_RE.exec(this.text.slice(this.pos));
49
+ return m ? m[0].toUpperCase() : null;
50
+ }
51
+ /** Consume and return the next bare word (uppercased), or null. */
52
+ takeWord() {
53
+ this.skipWs();
54
+ const m = WORD_RE.exec(this.text.slice(this.pos));
55
+ if (!m)
56
+ return null;
57
+ this.pos += m[0].length;
58
+ return m[0].toUpperCase();
59
+ }
60
+ /** Consume the given word sequence if (case-insensitively) present. */
61
+ tryWords(...words) {
62
+ const save = this.pos;
63
+ for (const word of words) {
64
+ if (this.takeWord() !== word.toUpperCase()) {
65
+ this.pos = save;
66
+ return false;
67
+ }
68
+ }
69
+ return true;
70
+ }
71
+ /** Consume one punctuation char if it matches. */
72
+ tryChar(ch) {
73
+ this.skipWs();
74
+ if (this.text[this.pos] === ch) {
75
+ this.pos += 1;
76
+ return true;
77
+ }
78
+ return false;
79
+ }
80
+ /**
81
+ * Consume an identifier: quoted ("x" / `x` / [x]) or bare word. Returns the
82
+ * unquoted spelling (bare identifiers keep their original case — imports
83
+ * preserve author casing). Null when the next token is not an identifier.
84
+ */
85
+ takeIdentifier() {
86
+ this.skipWs();
87
+ const ch = this.text[this.pos];
88
+ if (ch === '"' || ch === '`' || ch === '[') {
89
+ const close = ch === '[' ? ']' : ch;
90
+ let j = this.pos + 1;
91
+ while (j < this.text.length) {
92
+ if (this.text[j] === close) {
93
+ if (close !== ']' && this.text[j + 1] === close) {
94
+ j += 2;
95
+ continue;
96
+ }
97
+ const raw = this.text.slice(this.pos, j + 1);
98
+ this.pos = j + 1;
99
+ return unquoteIdent(raw);
100
+ }
101
+ j += 1;
102
+ }
103
+ return null;
104
+ }
105
+ const m = WORD_RE.exec(this.text.slice(this.pos));
106
+ if (!m)
107
+ return null;
108
+ this.pos += m[0].length;
109
+ return m[0];
110
+ }
111
+ /** Consume a possibly schema-qualified identifier → parts. */
112
+ takeQualifiedIdentifier() {
113
+ const first = this.takeIdentifier();
114
+ if (first === null)
115
+ return null;
116
+ const parts = [first];
117
+ while (this.tryChar('.')) {
118
+ const next = this.takeIdentifier();
119
+ if (next === null)
120
+ break;
121
+ parts.push(next);
122
+ }
123
+ return parts;
124
+ }
125
+ /** If next token is `(`, consume the balanced group and return its inner text. */
126
+ takeParenGroup() {
127
+ this.skipWs();
128
+ if (this.text[this.pos] !== '(')
129
+ return null;
130
+ const end = findBalanced(this.text, this.pos);
131
+ if (end === -1) {
132
+ const inner = this.text.slice(this.pos + 1);
133
+ this.pos = this.text.length;
134
+ return inner;
135
+ }
136
+ const inner = this.text.slice(this.pos + 1, end);
137
+ this.pos = end + 1;
138
+ return inner;
139
+ }
140
+ /** Consume a '...' string literal (with '' escapes); null otherwise. */
141
+ takeStringLiteral() {
142
+ this.skipWs();
143
+ if (this.text[this.pos] !== "'")
144
+ return null;
145
+ let j = this.pos + 1;
146
+ let out = '';
147
+ while (j < this.text.length) {
148
+ if (this.text[j] === "'") {
149
+ if (this.text[j + 1] === "'") {
150
+ out += "'";
151
+ j += 2;
152
+ continue;
153
+ }
154
+ this.pos = j + 1;
155
+ return out;
156
+ }
157
+ out += this.text[j];
158
+ j += 1;
159
+ }
160
+ this.pos = this.text.length;
161
+ return out;
162
+ }
163
+ /**
164
+ * Capture raw text until one of `stopWords` appears at paren depth 0 (or
165
+ * end of input). Used for DEFAULT expressions and type tails.
166
+ */
167
+ takeUntilWords(stopWords) {
168
+ this.skipWs();
169
+ const stops = new Set(stopWords.map((w) => w.toUpperCase()));
170
+ const start = this.pos;
171
+ while (this.pos < this.text.length) {
172
+ this.skipWs();
173
+ if (this.pos >= this.text.length)
174
+ break;
175
+ const ch = this.text[this.pos];
176
+ if (ch === '(') {
177
+ const end = findBalanced(this.text, this.pos);
178
+ this.pos = end === -1 ? this.text.length : end + 1;
179
+ continue;
180
+ }
181
+ if (ch === "'") {
182
+ this.takeStringLiteral();
183
+ continue;
184
+ }
185
+ if (ch === '"' || ch === '`' || ch === '[') {
186
+ this.takeIdentifier();
187
+ continue;
188
+ }
189
+ const m = WORD_RE.exec(this.text.slice(this.pos));
190
+ if (m) {
191
+ const word = m[0].toUpperCase();
192
+ // NOT only stops when followed by NULL (DEFAULT expr `x NOT LIKE…` is unlikely in DDL).
193
+ if (stops.has(word))
194
+ return this.text.slice(start, this.pos).trim();
195
+ this.pos += m[0].length;
196
+ continue;
197
+ }
198
+ this.pos += 1;
199
+ }
200
+ return this.text.slice(start).trim();
201
+ }
202
+ }
203
+ //# sourceMappingURL=sql-cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-cursor.js","sourceRoot":"","sources":["../../src/parsers/sql-cursor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * SQL DDL / pg_dump / mysqldump / sqlite parser — 05-introspection-engine.md
3
+ * §5.2 row 1. Hand-rolled tokenizer + statement splitter + per-statement
4
+ * mini-parsers. Everything that is not schema DDL (INSERT, COPY, SET,
5
+ * functions, grants, …) is skipped by design with aggregated warning counts,
6
+ * which makes whole pg_dump files safe to feed in. Crucially, pg_dump
7
+ * declares PKs and FKs via `ALTER TABLE ONLY … ADD CONSTRAINT`, so those are
8
+ * first-class here.
9
+ *
10
+ * Dialect sniff (documented contract): backticks / `ENGINE=` /
11
+ * `AUTO_INCREMENT` → mysql; `AUTOINCREMENT` / `WITHOUT ROWID` → sqlite;
12
+ * anything else → postgres (the format's home dialect).
13
+ */
14
+ import type { DatabaseModel } from '@adminium/engine';
15
+ import type { WarningList } from '../warnings.js';
16
+ export declare function parseSql(content: string, name: string, warnings: WarningList): DatabaseModel;
17
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/parsers/sql.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,aAAa,EAAqB,MAAM,kBAAkB,CAAC;AAOzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAiGlD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,aAAa,CAyC5F"}