@dbml/core 2.3.1 → 2.4.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 (31) hide show
  1. package/lib/export/DbmlExporter.js +9 -1
  2. package/lib/export/MysqlExporter.js +41 -35
  3. package/lib/export/PostgresExporter.js +55 -42
  4. package/lib/export/SqlServerExporter.js +43 -39
  5. package/lib/model_structure/database.js +53 -12
  6. package/lib/model_structure/endpoint.js +2 -2
  7. package/lib/model_structure/field.js +31 -1
  8. package/lib/model_structure/ref.js +1 -2
  9. package/lib/model_structure/schema.js +3 -19
  10. package/lib/model_structure/tableGroup.js +1 -1
  11. package/lib/model_structure/utils.js +5 -0
  12. package/lib/parse/dbml/parser.pegjs +61 -19
  13. package/lib/parse/dbmlParser.js +1219 -883
  14. package/lib/parse/mssql/fk_definition/actions.js +10 -3
  15. package/lib/parse/mssql/statements/actions.js +9 -6
  16. package/lib/parse/mssql/statements/statement_types/alter_table/actions.js +11 -5
  17. package/lib/parse/mssql/statements/statement_types/create_index/actions.js +6 -1
  18. package/lib/parse/mssql/statements/statement_types/create_table/actions.js +11 -9
  19. package/lib/parse/mssql/utils.js +15 -0
  20. package/lib/parse/mysql/parser.pegjs +46 -14
  21. package/lib/parse/mysqlParser.js +215 -167
  22. package/lib/parse/postgresParser.js +11 -10
  23. package/lib/parse/postgresql/Base_rules.pegjs +24 -3
  24. package/lib/parse/postgresql/Commands/Alter_table/Alter_table.pegjs +2 -1
  25. package/lib/parse/postgresql/Commands/Create_table/Create_table_normal.pegjs +5 -3
  26. package/lib/parse/postgresql/Commands/Create_table/Create_table_of.pegjs +1 -1
  27. package/lib/parse/postgresql/Commands/Create_table/Create_table_partition_of.pegjs +1 -1
  28. package/lib/parse/postgresql/Commands/Create_type/Create_type_enum.pegjs +2 -2
  29. package/lib/parse/postgresql/InitializerUtils.pegjs +10 -0
  30. package/lib/parse/postgresql/parser.pegjs +2 -1
  31. package/package.json +2 -2
@@ -2,9 +2,13 @@
2
2
 
3
3
  var _ = require('lodash');
4
4
 
5
+ var _require = require('../utils'),
6
+ getFullTableName = _require.getFullTableName;
7
+
5
8
  function makeEndPoint(tableName, columnName, relation) {
6
9
  return {
7
- tableName: tableName[tableName.length - 1],
10
+ tableName: tableName.name,
11
+ schemaName: tableName.schemaName,
8
12
  fieldNames: columnName,
9
13
  relation: relation
10
14
  };
@@ -24,7 +28,8 @@ function setOption(value, fkOptions) {
24
28
 
25
29
  function makeColumnConstraintFK(_unused, tableName, columnName, fkOptions) {
26
30
  var value = {};
27
- value.endpoint = makeEndPoint(tableName, columnName, '1');
31
+ var fullTableName = getFullTableName(tableName);
32
+ value.endpoint = makeEndPoint(fullTableName, columnName, '1');
28
33
  setOption(value, fkOptions);
29
34
  return {
30
35
  type: 'inline_refs',
@@ -43,6 +48,7 @@ function makeTableEndpoint(columnNames) {
43
48
 
44
49
  function makeTableConstraintFK(_keyword1, endpoint1, _keyword2, tableName, endpoint2, fkOptions) {
45
50
  var value = {};
51
+ var fullTableName = getFullTableName(tableName);
46
52
 
47
53
  if (!endpoint2) {
48
54
  // eslint-disable-next-line no-param-reassign
@@ -55,7 +61,8 @@ function makeTableConstraintFK(_keyword1, endpoint1, _keyword2, tableName, endpo
55
61
 
56
62
  endpoint1.value.relation = '*';
57
63
  endpoint2.value.relation = '1';
58
- endpoint2.value.tableName = _.last(tableName);
64
+ endpoint2.value.tableName = fullTableName.name;
65
+ endpoint2.value.schemaName = fullTableName.schemaName;
59
66
  value.endpoints = [endpoint1.value, endpoint2.value];
60
67
  setOption(value, fkOptions);
61
68
  return {
@@ -2,10 +2,13 @@
2
2
 
3
3
  var _ = require('lodash');
4
4
 
5
- function findTable(ast, tableName) {
6
- return ast.tables.find(function (_table) {
7
- return _table.name === tableName;
5
+ function findTable(ast, tableName, schemaName) {
6
+ var realSchemaName = schemaName || 'public';
7
+ var table = ast.tables.find(function (t) {
8
+ var targetSchemaName = t.schemaName || 'public';
9
+ return targetSchemaName === realSchemaName && t.name === tableName;
8
10
  });
11
+ return table;
9
12
  }
10
13
 
11
14
  function findField(table, fieldName) {
@@ -15,7 +18,7 @@ function findField(table, fieldName) {
15
18
  }
16
19
 
17
20
  function handleIndexes(index, ast) {
18
- var table = findTable(ast, index.tableName);
21
+ var table = findTable(ast, index.tableName, index.schemaName);
19
22
  table.indexes.push(index);
20
23
  index.tableName = null;
21
24
  }
@@ -37,7 +40,7 @@ function handleTable(table, ast) {
37
40
  }
38
41
 
39
42
  function handleDefaults(dbdefault, ast) {
40
- var table = findTable(ast, dbdefault.tableName);
43
+ var table = findTable(ast, dbdefault.tableName, dbdefault.schemaName);
41
44
  var field = findField(table, dbdefault.fieldName);
42
45
  dbdefault.fieldName = null;
43
46
  dbdefault.tableName = null;
@@ -45,7 +48,7 @@ function handleDefaults(dbdefault, ast) {
45
48
  }
46
49
 
47
50
  function handleEnums(_enum, ast) {
48
- var table = findTable(ast, _enum.tableName);
51
+ var table = findTable(ast, _enum.tableName, _enum.schemaName);
49
52
  var field = findField(table, _enum.fieldName);
50
53
  _enum.name = "".concat(_enum.tableName, "_").concat(_enum.fieldName, "_enum");
51
54
  _enum.fieldName = null;
@@ -2,31 +2,37 @@
2
2
 
3
3
  var _ = require('lodash');
4
4
 
5
+ var _require = require('../../../utils'),
6
+ getFullTableName = _require.getFullTableName;
7
+
5
8
  function handleRef(tableName, result) {
6
9
  var endpointWithNoTableName = result.value.endpoints.find(function (ele) {
7
10
  return !ele.tableName;
8
11
  });
9
- endpointWithNoTableName.tableName = _.last(tableName);
12
+ endpointWithNoTableName.tableName = tableName.name;
13
+ endpointWithNoTableName.schemaName = tableName.schemaName;
10
14
  }
11
15
 
12
16
  function addTableName(tableName, result) {
13
- result.value.tableName = _.last(tableName);
17
+ result.value.tableName = tableName.name;
18
+ result.value.schemaName = tableName.schemaName;
14
19
  }
15
20
 
16
21
  function handleAlterTableResult(_keyword, tableName, results) {
17
- if (!results) return null; // eslint-disable-next-line consistent-return
22
+ if (!results) return null;
23
+ var fullName = getFullTableName(tableName); // eslint-disable-next-line consistent-return
18
24
 
19
25
  results.forEach(function (result) {
20
26
  if (result) {
21
27
  switch (result.type) {
22
28
  case 'refs':
23
- handleRef(tableName, result);
29
+ handleRef(fullName, result);
24
30
  break;
25
31
 
26
32
  case 'indexes':
27
33
  case 'dbdefault':
28
34
  case 'enums':
29
- addTableName(tableName, result);
35
+ addTableName(fullName, result);
30
36
  break;
31
37
 
32
38
  default:
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
2
 
3
+ var _require = require('../../../utils'),
4
+ getFullTableName = _require.getFullTableName;
5
+
3
6
  function makeIndex(_create, isUnique, _clustered, _index, indexName, _on, tableName, columnNames) {
7
+ var fullTableName = getFullTableName(tableName);
4
8
  var columns = [];
5
9
  columnNames.forEach(function (columnName) {
6
10
  columns.push({
@@ -13,7 +17,8 @@ function makeIndex(_create, isUnique, _clustered, _index, indexName, _on, tableN
13
17
  value: {
14
18
  name: indexName,
15
19
  unique: isUnique ? true : null,
16
- tableName: tableName[tableName.length - 1],
20
+ tableName: fullTableName.name,
21
+ schemaName: fullTableName.schemaName,
17
22
  columns: columns
18
23
  }
19
24
  };
@@ -8,6 +8,9 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope
8
8
 
9
9
  var _ = require('lodash');
10
10
 
11
+ var _require = require('../../../utils'),
12
+ getFullTableName = _require.getFullTableName;
13
+
11
14
  function createRefFromInlineRef(linesRefs, inlineRefs, fieldName, tableName) {
12
15
  if (!inlineRefs || inlineRefs.length === 0) return;
13
16
  var newRef = {};
@@ -16,7 +19,8 @@ function createRefFromInlineRef(linesRefs, inlineRefs, fieldName, tableName) {
16
19
  newRef.onDelete = inlineRef.onDelete;
17
20
  newRef.endpoints = [];
18
21
  newRef.endpoints.push({
19
- tableName: tableName,
22
+ tableName: tableName.name,
23
+ schemaName: tableName.schemaName,
20
24
  fieldNames: [fieldName],
21
25
  relation: '*'
22
26
  });
@@ -33,7 +37,7 @@ function pushOutEnum(linesEnums, fieldValue, tableName) {
33
37
  if (fieldValue.enums) {
34
38
  var _enum = fieldValue.enums;
35
39
  var fieldType = fieldValue.type;
36
- _enum.name = "".concat(tableName, "_").concat(fieldValue.enums.name);
40
+ _enum.name = "".concat(tableName.schemaName ? "".concat(tableName.schemaName, "_") : '').concat(tableName.name, "_").concat(fieldValue.enums.name);
37
41
  fieldType.type_name = _enum.name;
38
42
  fieldType.args = _enum.values.map(function (value) {
39
43
  return "'".concat(value.name, "'");
@@ -71,7 +75,8 @@ function getLinesValue(lines, tableName) {
71
75
 
72
76
  if (line.type === 'refs') {
73
77
  var ref = line.value;
74
- ref.endpoints[0].tableName = tableName;
78
+ ref.endpoints[0].tableName = tableName.name;
79
+ ref.endpoints[0].schemaName = tableName.schemaName;
75
80
  }
76
81
 
77
82
  value[line.type].push(line.value);
@@ -84,14 +89,11 @@ function getLinesValue(lines, tableName) {
84
89
  }
85
90
 
86
91
  function makeTable(_keyword, tableName, _keyword2, lines) {
87
- var linesValue = getLinesValue(lines, _.last(tableName));
92
+ var fullName = getFullTableName(tableName);
93
+ var linesValue = getLinesValue(lines, fullName);
88
94
  return {
89
95
  type: 'tables',
90
- value: _objectSpread(_objectSpread({
91
- name: _.last(tableName)
92
- }, linesValue.value), {}, {
93
- schemaName: tableName.length > 1 ? tableName[tableName.length - 2] : null
94
- })
96
+ value: _objectSpread(_objectSpread({}, fullName), linesValue.value)
95
97
  };
96
98
  }
97
99
 
@@ -4,6 +4,8 @@ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "functi
4
4
 
5
5
  var P = require('parsimmon');
6
6
 
7
+ var _ = require('lodash');
8
+
7
9
  var _require = require('./keyword_parsers'),
8
10
  LParen = _require.LParen,
9
11
  RParen = _require.RParen,
@@ -47,4 +49,17 @@ exports.streamline = function (type) {
47
49
  };
48
50
  });
49
51
  };
52
+ };
53
+
54
+ exports.getFullTableName = function (nameList) {
55
+ var schemaName = null;
56
+
57
+ if (nameList.length > 1) {
58
+ schemaName = nameList[nameList.length - 2];
59
+ }
60
+
61
+ return {
62
+ name: _.last(nameList),
63
+ schemaName: schemaName
64
+ };
50
65
  };
@@ -4,6 +4,15 @@
4
4
  const refs = [];
5
5
  const enums = [];
6
6
 
7
+ // TODO: support configurable default schema name other than 'public'
8
+ const findTable = (schemaName, tableName) => {
9
+ const realSchemaName = schemaName || 'public';
10
+ const table = tables.find(table => {
11
+ const targetSchemaName = table.schemaName || 'public';
12
+ return targetSchemaName === realSchemaName && table.name === tableName;
13
+ });
14
+ return table;
15
+ };
7
16
  // intput:
8
17
  // `
9
18
  // 'created'
@@ -35,9 +44,9 @@ Expr =
35
44
  // TableSyntax: support "CREATE TABLE" syntax.
36
45
  // Try to support as mush as possible syntax in MySQL offical documents.
37
46
  // https://dev.mysql.com/doc/refman/8.0/en/create-table.html
38
- // Return: table object: {name, fields, [,indexes]}
47
+ // Return: table object: {name, schemaName, fields, [,indexes]}
39
48
  TableSyntax
40
- = create_table (__ if_not_exist)? __ name:table_name _
49
+ = create_table (__ if_not_exist)? __ table_name:table_name _
41
50
  "(" _ body:TableBody _ ")" _ TableOptions? _ semicolon endline?
42
51
  {
43
52
  const fields = body.fields;
@@ -59,7 +68,8 @@ TableSyntax
59
68
  });
60
69
 
61
70
  const _enum = {
62
- name: `${name}_${field.name}_enum`,
71
+ name: `${table_name.schemaName
72
+ ? `${table_name.schemaName}_` : ''}${table_name.name}_${field.name}_enum`,
63
73
  values
64
74
  };
65
75
  enums.push(_enum);
@@ -68,15 +78,16 @@ TableSyntax
68
78
  });
69
79
 
70
80
  bodyRefs.forEach(ref => {
71
- ref.endpoints[0].tableName = name;
81
+ ref.endpoints[0].tableName = table_name.name;
82
+ ref.endpoints[0].schemaName = table_name.schemaName;
72
83
  ref.endpoints[0].relation = '*';
73
84
  refs.push(ref);
74
85
  });
75
86
 
76
87
  // return statement
77
88
  return indexes ?
78
- {name, fields, indexes}
79
- : {name, fields}
89
+ {...table_name, fields, indexes}
90
+ : {...table_name, fields}
80
91
  }
81
92
 
82
93
  // TableBody: this is the part between parenthesis.
@@ -149,7 +160,8 @@ FKSyntax = _ constraint:("CONSTRAINT"i _ name)? _ foreign_key _
149
160
  relation: "*",
150
161
  },
151
162
  {
152
- tableName: table2,
163
+ tableName: table2.name,
164
+ schemaName: table2.schemaName,
153
165
  fieldNames: fields2,
154
166
  relation: "1",
155
167
  }
@@ -295,16 +307,19 @@ CheckConstraintSyntax = _ ("CONSTRAINT"i name _)? "CHECK"i _ expression _ ("NOT"
295
307
  // AlterSyntax: support "ALTER TABLE" syntax
296
308
  // We will support ADD_COLUMN, ADD_FOREIGN_KEY, ADD_INDEX
297
309
  // https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
298
- AlterSyntax = alter_table _ table:name _
310
+ AlterSyntax = alter_table _ table:table_name _
299
311
  options:(AddOptions/ChangeOptions/DropOptions) _
300
312
  semicolon
301
313
  {
302
314
  const fks = _.flatten(options.filter(o => o.type === "add_fk").map(o => o.fks));
303
- fks.forEach(fk => {fk.endpoints[0].tableName = table});
315
+ fks.forEach(fk => {
316
+ fk.endpoints[0].tableName = table.name;
317
+ fk.endpoints[0].schemaName = table.schemaName;
318
+ });
304
319
  refs.push(...fks)
305
320
 
306
321
  const pks = _.flatten(options.filter(o => o.type === "add_pk").map(o => o.pks));
307
- const tableAlter = tables.find((t) => t.name === table);
322
+ const tableAlter = findTable(table.schemaName, table.name);
308
323
 
309
324
  const index = {
310
325
  columns: pks.map(field => ({
@@ -341,7 +356,7 @@ DropOptions = "DROP"i [^;]
341
356
 
342
357
  // IndexSyntax: support "CREATE INDEX" syntax
343
358
  IndexSyntax = constraint:create_index _ indexName:name _
344
- "ON"i _ tableName:name _ indexType:index_type? _
359
+ "ON"i _ tableName:table_name _ indexType:index_type? _
345
360
  columns: IndexColumn _
346
361
  option:IndexOption? semicolon
347
362
  {
@@ -358,7 +373,8 @@ IndexSyntax = constraint:create_index _ indexName:name _
358
373
  if(type)
359
374
  index.type = type;
360
375
 
361
- const table = tables.find(table => table.name === tableName);
376
+ const table = findTable(tableName.schemaName, tableName.name);
377
+
362
378
  if(table.indexes) {
363
379
  table.indexes.push(index);
364
380
  } else {
@@ -458,8 +474,24 @@ index_type "index type" = "USING"i _ type:("BTREE"i/"HASH"i) { return type.toUpp
458
474
  name "valid name"
459
475
  = c:(character)+ { return c.join("") }
460
476
  / quote c:[^`]+ quote { return c.join("") }
461
- table_name "valid table name"
462
- = (name _ "." _)* name:name { return name }
477
+
478
+ path_name = names:(name _ "." _)* {
479
+ let dbName = null;
480
+ let schemaName = null;
481
+ if (names && names.length > 0) {
482
+ if (names.length === 1) schemaName = names[0][0];
483
+ else {
484
+ dbName = names[0][0];
485
+ schemaName = names[1][0];
486
+ }
487
+ }
488
+ return { dbName, schemaName }
489
+ }
490
+
491
+ table_name "valid table name" = pathName:path_name name:name {
492
+ return { ...pathName, name }
493
+ }
494
+
463
495
  type "type" = c:type_name { return c }
464
496
  / c:name { return { type_name: c } }
465
497
  type_name = type_name:name _ args:("(" _ expression _ ")")? {