@dbml/core 2.3.1 → 2.4.2

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 (40) hide show
  1. package/lib/export/DbmlExporter.js +11 -6
  2. package/lib/export/MysqlExporter.js +127 -48
  3. package/lib/export/PostgresExporter.js +142 -55
  4. package/lib/export/SqlServerExporter.js +130 -52
  5. package/lib/export/utils.js +40 -0
  6. package/lib/model_structure/database.js +53 -12
  7. package/lib/model_structure/endpoint.js +2 -2
  8. package/lib/model_structure/field.js +31 -1
  9. package/lib/model_structure/ref.js +1 -2
  10. package/lib/model_structure/schema.js +3 -19
  11. package/lib/model_structure/tableGroup.js +1 -1
  12. package/lib/model_structure/utils.js +5 -0
  13. package/lib/parse/dbml/parser.pegjs +74 -24
  14. package/lib/parse/dbmlParser.js +1275 -886
  15. package/lib/parse/mssql/fk_definition/actions.js +10 -3
  16. package/lib/parse/mssql/keyword_parsers.js +12 -1
  17. package/lib/parse/mssql/statements/actions.js +37 -6
  18. package/lib/parse/mssql/statements/index.js +1 -1
  19. package/lib/parse/mssql/statements/statement_types/alter_table/actions.js +11 -5
  20. package/lib/parse/mssql/statements/statement_types/comments/actions.js +57 -0
  21. package/lib/parse/mssql/statements/statement_types/comments/index.js +97 -0
  22. package/lib/parse/mssql/statements/statement_types/create_index/actions.js +6 -1
  23. package/lib/parse/mssql/statements/statement_types/create_table/actions.js +11 -9
  24. package/lib/parse/mssql/statements/statement_types/index.js +4 -1
  25. package/lib/parse/mssql/utils.js +15 -0
  26. package/lib/parse/mysql/parser.pegjs +55 -20
  27. package/lib/parse/mysqlParser.js +479 -308
  28. package/lib/parse/postgresParser.js +15 -14
  29. package/lib/parse/postgresql/Base_rules.pegjs +24 -3
  30. package/lib/parse/postgresql/Commands/Alter_table/Alter_table.pegjs +49 -4
  31. package/lib/parse/postgresql/Commands/Comment.pegjs +18 -6
  32. package/lib/parse/postgresql/Commands/Create_table/Create_table_normal.pegjs +5 -3
  33. package/lib/parse/postgresql/Commands/Create_table/Create_table_of.pegjs +1 -1
  34. package/lib/parse/postgresql/Commands/Create_table/Create_table_partition_of.pegjs +1 -1
  35. package/lib/parse/postgresql/Commands/Create_type/Create_type_enum.pegjs +2 -2
  36. package/lib/parse/postgresql/Commands/Ignore_syntax.pegjs +10 -1
  37. package/lib/parse/postgresql/InitializerUtils.pegjs +14 -2
  38. package/lib/parse/postgresql/Keywords.pegjs +5 -1
  39. package/lib/parse/postgresql/parser.pegjs +22 -8
  40. package/package.json +2 -2
@@ -5,9 +5,16 @@
5
5
  refs: [],
6
6
  enums: [],
7
7
  tableGroups: [],
8
+ aliases: [],
8
9
  project: {},
9
10
  };
10
11
  let projectCnt = 0;
12
+ function getRelations(operator) {
13
+ if(operator === '<>') return ['*','*'];
14
+ if(operator === '>') return ['*','1'];
15
+ if(operator === '<') return ['1','*'];
16
+ if(operator === '-') return ['1','1'];
17
+ }
11
18
  }
12
19
 
13
20
  rules
@@ -122,23 +129,31 @@ ProjectField
122
129
  }
123
130
  }
124
131
 
125
- TableGroupSyntax = table_group sp+ name:name _ "{" _ body:table_group_body _ "}" {
132
+ TableGroupSyntax = table_group sp+ schemaName:schema_name? name:name _ "{" _ body:table_group_body _ "}" {
126
133
  return {
127
134
  name: name,
135
+ schemaName,
128
136
  tables: body,
129
137
  token: location()
130
138
  }
131
139
  }
132
140
 
133
- table_group_body = tables:(name __)* {
141
+ table_group_body = tables:(schema_name? name __)* {
134
142
  return tables.map(t => ({
135
- name: t[0]
143
+ name: t[1],
144
+ schemaName: t[0]
136
145
  }));
137
146
  }
138
147
 
139
148
  // References
140
149
  RefSyntax
141
- = r: (ref_long / ref_short) { return r; }
150
+ = r: (ref_long / ref_short) {
151
+ const schemaName = r.endpoints[0].schemaName;
152
+ return {
153
+ ...r,
154
+ schemaName,
155
+ };
156
+ }
142
157
 
143
158
  ref_long
144
159
  = ref name:(__ name)? _ "{" _ body:ref_body _ "}" {
@@ -163,18 +178,21 @@ ref_short
163
178
  }
164
179
 
165
180
  ref_body
166
- = table1:name "." field1:RefField sp+ relation:relation sp+ table2:name "." field2:RefField sp* ref_settings:RefSettings? {
181
+ = field1:field_identifier sp+ relation:relation sp+ field2:field_identifier sp* ref_settings:RefSettings? {
182
+ const rel = getRelations(relation);
167
183
  const endpoints = [
168
184
  {
169
- tableName: table1,
170
- fieldNames: field1,
171
- relation: relation === ">" ? "*" : "1",
185
+ schemaName: field1.schemaName,
186
+ tableName: field1.tableName,
187
+ fieldNames: field1.fieldNames,
188
+ relation: rel[0],
172
189
  token: location()
173
190
  },
174
191
  {
175
- tableName: table2,
176
- fieldNames: field2,
177
- relation: relation === "<" ? "*" : "1",
192
+ schemaName: field2.schemaName,
193
+ tableName: field2.tableName,
194
+ fieldNames: field2.fieldNames,
195
+ relation: rel[1],
178
196
  token: location()
179
197
  }
180
198
  ];
@@ -224,7 +242,7 @@ OnDelete
224
242
 
225
243
  // Tables
226
244
  TableSyntax
227
- = table sp+ name:name alias:alias_def? sp* table_settings:TableSettings? _ "{" body:TableBody "}" {
245
+ = table sp+ schemaName:schema_name? name:name alias:alias_def? sp* table_settings:TableSettings? _ "{" body:TableBody "}" {
228
246
  let fields = body.fields || [];
229
247
  let indexes = body.indexes || [];
230
248
  // Handle list of partial inline_refs
@@ -232,21 +250,25 @@ TableSyntax
232
250
 
233
251
  fields.forEach((field) => {
234
252
  (field.inline_refs || []).forEach((iref) => {
253
+ const rel = getRelations(iref.relation);
235
254
  const endpoints = [
236
255
  {
256
+ schemaName: iref.schemaName,
237
257
  tableName: iref.tableName,
238
258
  fieldNames: iref.fieldNames,
239
- relation: iref.relation === "<" ? "*" : "1",
259
+ relation: rel[1],
240
260
  token: iref.token
241
261
  },
242
262
  {
263
+ schemaName: schemaName,
243
264
  tableName: name,
244
265
  fieldNames: [field.name],
245
- relation: iref.relation === ">" ? "*" : "1",
266
+ relation: rel[0],
246
267
  token: iref.token
247
268
  }];
248
269
 
249
270
  let ref = {
271
+ schemaName,
250
272
  name: null, // no name
251
273
  endpoints: endpoints,
252
274
  token: iref.token
@@ -255,8 +277,21 @@ TableSyntax
255
277
  })
256
278
  });
257
279
 
280
+ if (alias) {
281
+ if (data.aliases.find(a => a.name === alias)) error(`Alias "${alias}" is already defined`);
282
+ data.aliases.push({
283
+ name: alias,
284
+ kind: 'table',
285
+ value: {
286
+ tableName: name,
287
+ schemaName: schemaName,
288
+ }
289
+ })
290
+ }
291
+
258
292
  let res = {
259
293
  name: name,
294
+ schemaName,
260
295
  alias: alias,
261
296
  fields: fields,
262
297
  token: location(),
@@ -323,10 +358,13 @@ TableElement
323
358
  }
324
359
 
325
360
  Field
326
- = _ name:name sp+ type:type constrains:(sp+ constrain)* field_settings:(sp+ FieldSettings)? sp* comment? newline {
361
+ = _ name:name sp+ typeSchemaName:schema_name? type:type constrains:(sp+ constrain)* field_settings:(sp+ FieldSettings)? sp* comment? newline {
327
362
  const field = {
328
363
  name: name,
329
- type: type,
364
+ type: {
365
+ schemaName: typeSchemaName,
366
+ ...type,
367
+ },
330
368
  token: location(),
331
369
  inline_refs: []
332
370
  }
@@ -338,9 +376,10 @@ Field
338
376
  }
339
377
 
340
378
  EnumSyntax
341
- = enum sp+ name:name _ "{" body: EnumBody "}" {
379
+ = enum sp+ schemaName:schema_name? name:name _ "{" body: EnumBody "}" {
342
380
  return {
343
381
  name: name,
382
+ schemaName,
344
383
  token: location(),
345
384
  values: body.enum_values
346
385
  };
@@ -437,7 +476,7 @@ FieldSetting
437
476
  / _ a:"unique"i _ { return a }
438
477
  / _ a:"increment" _ { return a }
439
478
  / _ v:ObjectNote _ { return { type: 'note', value: v } }
440
- / _ v:RefInline { return { type: 'ref_inline', value: v } }
479
+ / _ v:RefInline _ { return { type: 'ref_inline', value: v } }
441
480
  / _ v:Default _ {return {type: 'default', value: v} }
442
481
 
443
482
  Indexes
@@ -523,10 +562,11 @@ ObjectNote
523
562
  IndexType
524
563
  = "type:"i _ val:(btree/hash) { return val }
525
564
  RefInline
526
- = "ref:" sp* relation:relation sp+ table2:name "." field2:name {
565
+ = "ref:" sp* relation:relation sp+ field:inline_field_identifier{
527
566
  return {
528
- tableName: table2,
529
- fieldNames: [field2],
567
+ schemaName: field.schemaName,
568
+ tableName: field.tableName,
569
+ fieldNames: [field.fieldName],
530
570
  relation: relation,
531
571
  token: location(),
532
572
  }
@@ -579,11 +619,21 @@ set_null "set null" = "set null"i
579
619
  set_default "set default" = "set default"i
580
620
 
581
621
  // Commonly used tokens
582
- relation ">, - or <" = [>\-<]
622
+ relation "<>, >, - or <" = '<>' / '>' / '<' / '-'
583
623
  name "valid name"
584
624
  = c:(character+) { return c.join("") }
585
625
  / quote c:[^\"\n]+ quote { return c.join("") }
586
626
 
627
+ schema_name "schema name" = name:name "." { return name }
628
+
629
+ field_identifier =
630
+ schemaName:name "." tableName:name "." fieldNames:RefField { return { schemaName, tableName, fieldNames } } /
631
+ tableName:name "." fieldNames:RefField { return { schemaName: null, tableName, fieldNames } }
632
+
633
+ inline_field_identifier =
634
+ schemaName:name "." tableName:name "." fieldName:name { return { schemaName, tableName, fieldName } } /
635
+ tableName:name "." fieldName:name { return { schemaName: null, tableName, fieldName } }
636
+
587
637
  type_name "valid name"
588
638
  = c:(type_character+) { return c.join("") }
589
639
  / quote c:[^\"\n]+ quote { return c.join("") }
@@ -707,10 +757,10 @@ BooleanLiteral = boolean: ('true'i/'false'i/'null'i) {
707
757
  value: boolean
708
758
  };
709
759
  }
710
- NumberLiteral = number:(float / integer) {
760
+ NumberLiteral = minus:"-"? number:(float / integer) {
711
761
  return {
712
762
  type: 'number',
713
- value: number
763
+ value: minus ? -number : number
714
764
  };
715
765
  }
716
766
  float