@dbml/core 2.4.0 → 2.4.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.
@@ -193,10 +193,6 @@ var DbmlExporter = /*#__PURE__*/function () {
193
193
  settingStr += "headerColor: ".concat(table.headerColor).concat(settingSep);
194
194
  }
195
195
 
196
- if (table.note) {
197
- settingStr += "note: '".concat(table.note, "'").concat(settingSep);
198
- }
199
-
200
196
  if (settingStr.endsWith(', ')) {
201
197
  settingStr = settingStr.replace(/,\s$/, '');
202
198
  }
@@ -223,9 +219,10 @@ var DbmlExporter = /*#__PURE__*/function () {
223
219
  }).join('\n'), "\n}");
224
220
  }
225
221
 
222
+ var tableNote = table.note ? " Note: '".concat(table.note, "'\n") : '';
226
223
  var tableStr = "Table ".concat((0, _utils.shouldPrintSchema)(schema, model) ? "\"".concat(schema.name, "\".") : '', "\"").concat(table.name, "\"").concat(tableSettingStr, " {\n").concat(tableContent.fieldContents.map(function (line) {
227
224
  return " ".concat(line);
228
- }).join('\n'), "\n").concat(indexStr ? "".concat(indexStr, "\n") : '', "}\n");
225
+ }).join('\n'), "\n").concat(indexStr ? "".concat(indexStr, "\n") : '').concat(tableNote, "}\n");
229
226
  return tableStr;
230
227
  });
231
228
  return tableStrs.length ? tableStrs.join('\n') : '';
@@ -83,6 +83,7 @@ exports.KeywordCollate = keyword(/COLLATE/i);
83
83
  exports.KeywordClose = keyword(/CLOSE/i);
84
84
  exports.KeywordDeny = keyword(/DENY/i);
85
85
  exports.KeywordExecute = keyword(/EXECUTE/i);
86
+ exports.KeywordExec = keyword(/EXEC/i);
86
87
  exports.KeywordGrant = keyword(/GRANT/i);
87
88
  exports.KeywordOpen = keyword(/OPEN/i);
88
89
  exports.KeywordRevoke = keyword(/REVOKE/i);
@@ -96,6 +97,7 @@ exports.KeywordSend = keyword(/SEND/i);
96
97
  exports.KeywordRename = keyword(/RENAME/i);
97
98
  exports.KeywordDelete = keyword(/DELETE/i);
98
99
  exports.KeywordIf = keyword(/IF/i);
100
+ exports.KeywordSP_ADDEXTENDEDPROPERTY = keyword(/sp_addextendedproperty/i);
99
101
  exports.LogicalOpIn = keyword(/IN/i);
100
102
  exports.LogicalOpAnd = keyword(/AND/i);
101
103
  exports.LessThan = word('<');
@@ -104,7 +106,16 @@ exports.LParen = word('(');
104
106
  exports.Comma = word(',');
105
107
  exports.RParen = word(')');
106
108
  exports.DoubleQuote = word('"');
109
+ exports.SingleQuote = word('\'');
107
110
  exports.LBracket = word('[');
108
111
  exports.RBracket = word(']');
109
112
  exports.Equal = word('=');
110
- exports.Semicolon = word(';');
113
+ exports.Semicolon = word(';');
114
+ exports.KeywordAtName = keyword(/@name/i);
115
+ exports.KeywordAtValue = keyword(/@value/i);
116
+ exports.KeywordAtLevel0Type = keyword(/@level0type/i);
117
+ exports.KeywordAtLevel0Name = keyword(/@level0name/i);
118
+ exports.KeywordAtLevel1Type = keyword(/@level1type/i);
119
+ exports.KeywordAtLevel1Name = keyword(/@level1name/i);
120
+ exports.KeywordAtLevel2Type = keyword(/@level2type/i);
121
+ exports.KeywordAtLevel2Name = keyword(/@level2name/i);
@@ -59,6 +59,30 @@ function handleEnums(_enum, ast) {
59
59
  }).join(', ');
60
60
  }
61
61
 
62
+ function handleComment(comment, ast) {
63
+ if (comment.type === 'table') handleTableNote(comment, ast);else if (comment.type === 'column') handleFieldNote(comment, ast);
64
+ }
65
+
66
+ function handleTableNote(comment, ast) {
67
+ var schemaName = comment.schemaName;
68
+ if (schemaName === 'dbo') schemaName = null; // treat `dbo` as public schema
69
+
70
+ var foundTable = findTable(ast, comment.tableName, schemaName);
71
+ if (foundTable) foundTable.note = comment.note;
72
+ }
73
+
74
+ function handleFieldNote(comment, ast) {
75
+ var schemaName = comment.schemaName;
76
+ if (schemaName === 'dbo') schemaName = null; // treat `dbo` as public schema
77
+
78
+ var foundTable = findTable(ast, comment.tableName, schemaName);
79
+
80
+ if (foundTable) {
81
+ var foundField = findField(foundTable, comment.columnName);
82
+ if (foundField) foundField.note = comment.note;
83
+ }
84
+ }
85
+
62
86
  function handleStatement(_statements) {
63
87
  var ast = {
64
88
  tables: [],
@@ -90,6 +114,10 @@ function handleStatement(_statements) {
90
114
  handleEnums(statement.value, ast);
91
115
  break;
92
116
 
117
+ case 'comment':
118
+ handleComment(statement.value, ast);
119
+ break;
120
+
93
121
  default:
94
122
  break;
95
123
  }
@@ -18,7 +18,7 @@ var Lang = P.createLanguage({
18
18
  return wss.then(r.Seperator).then(P.sepBy(r.StatementTypes, r.Seperator)).skip(r.Seperator).map(A.handleStatement);
19
19
  },
20
20
  StatementTypes: function StatementTypes(r) {
21
- return P.alt(S.pCreateIndex, S.pCreateTable, S.pAlterTable, r.IgnoredStatementTypes);
21
+ return P.alt(S.pCreateIndex, S.pCreateTable, S.pAlterTable, S.pCommentSyntax, r.IgnoredStatementTypes);
22
22
  },
23
23
  IgnoredStatementTypes: function IgnoredStatementTypes(r) {
24
24
  return P.seq(r.IgnoredStatementSyntax, pIgnore);
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ function handleComment(_ref) {
4
+ var note = _ref.note,
5
+ level = _ref.level;
6
+ var type = 'unsupported';
7
+ var schemaName = null,
8
+ tableName = null,
9
+ columnName = null;
10
+
11
+ if (isValidTableNote(level)) {
12
+ schemaName = level[0].name;
13
+ tableName = level[1].name; // Table Comment
14
+
15
+ type = 'table';
16
+ } else if (isValidColumnNote(level)) {
17
+ schemaName = level[0].name;
18
+ tableName = level[1].name;
19
+ columnName = level[2].name;
20
+ type = 'column';
21
+ }
22
+
23
+ return {
24
+ type: 'comment',
25
+ value: {
26
+ type: type,
27
+ note: note,
28
+ schemaName: schemaName,
29
+ tableName: tableName,
30
+ columnName: columnName
31
+ }
32
+ };
33
+ }
34
+
35
+ var isSchema = function isSchema(type) {
36
+ return type.toLowerCase() === 'schema';
37
+ };
38
+
39
+ var isTable = function isTable(type) {
40
+ return type.toLowerCase() === 'table';
41
+ };
42
+
43
+ var isColumn = function isColumn(type) {
44
+ return type.toLowerCase() === 'column';
45
+ };
46
+
47
+ var isValidTableNote = function isValidTableNote(level) {
48
+ return level.length === 2 && isSchema(level[0].type) && isTable(level[1].type);
49
+ };
50
+
51
+ var isValidColumnNote = function isValidColumnNote(level) {
52
+ return level.length === 3 && isSchema(level[0].type) && isTable(level[1].type) && isColumn(level[2].type);
53
+ };
54
+
55
+ module.exports = {
56
+ handleComment: handleComment
57
+ };
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+
3
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
4
+
5
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
6
+
7
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
8
+
9
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
10
+
11
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
12
+
13
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
14
+
15
+ var P = require('parsimmon');
16
+
17
+ var KP = require('../../../keyword_parsers');
18
+
19
+ var A = require('./actions');
20
+
21
+ var _require = require('../../../utils'),
22
+ makeNode = _require.makeNode;
23
+
24
+ var Lang = P.createLanguage({
25
+ StartComment: function StartComment() {
26
+ return P.seq(KP.KeywordExec, KP.KeywordSP_ADDEXTENDEDPROPERTY);
27
+ },
28
+ EndComment: function EndComment() {
29
+ return P.seq(KP.Semicolon.atMost(1), KP.KeywordGo);
30
+ },
31
+ StartString: function StartString() {
32
+ return P.alt(KP.SingleQuote, P.string("N'"));
33
+ },
34
+ ManyDoubleSingleQuote: function ManyDoubleSingleQuote() {
35
+ return P.string("''");
36
+ },
37
+ NoSingleQuote: function NoSingleQuote() {
38
+ return P.regex(/[^']/);
39
+ },
40
+ StringType: function StringType(r) {
41
+ return P.alt(r.NoSingleQuote, r.ManyDoubleSingleQuote).atLeast(1).map(function (res) {
42
+ return res.join('');
43
+ });
44
+ },
45
+ NVarchar: function NVarchar(r) {
46
+ return r.StartString.then(r.StringType).skip(KP.SingleQuote);
47
+ },
48
+ NameOption: function NameOption(r) {
49
+ return KP.KeywordAtName.skip(KP.Equal).then(r.NVarchar);
50
+ },
51
+ ValueOption: function ValueOption(r) {
52
+ return KP.KeywordAtValue.skip(KP.Equal).then(r.NVarchar);
53
+ },
54
+ Level0Type: function Level0Type(r) {
55
+ return KP.KeywordAtLevel0Type.skip(KP.Equal).then(r.NVarchar);
56
+ },
57
+ Level0Name: function Level0Name(r) {
58
+ return KP.KeywordAtLevel0Name.skip(KP.Equal).then(r.NVarchar);
59
+ },
60
+ Level1Type: function Level1Type(r) {
61
+ return KP.KeywordAtLevel1Type.skip(KP.Equal).then(r.NVarchar);
62
+ },
63
+ Level1Name: function Level1Name(r) {
64
+ return KP.KeywordAtLevel1Name.skip(KP.Equal).then(r.NVarchar);
65
+ },
66
+ Level2Type: function Level2Type(r) {
67
+ return KP.KeywordAtLevel2Type.skip(KP.Equal).then(r.NVarchar);
68
+ },
69
+ Level2Name: function Level2Name(r) {
70
+ return KP.KeywordAtLevel2Name.skip(KP.Equal).then(r.NVarchar);
71
+ },
72
+ Level0Stmt: function Level0Stmt(r) {
73
+ return P.seqObj(['type', r.Level0Type], KP.Comma, ['name', r.Level0Name]);
74
+ },
75
+ Level1Stmt: function Level1Stmt(r) {
76
+ return P.seqObj(['type', r.Level1Type], KP.Comma, ['name', r.Level1Name]);
77
+ },
78
+ Level2Stmt: function Level2Stmt(r) {
79
+ return P.seqObj(['type', r.Level2Type], KP.Comma, ['name', r.Level2Name]);
80
+ },
81
+ Level0Wrapper: function Level0Wrapper(r) {
82
+ return P.alt(P.seq(r.Level0Stmt.skip(KP.Comma), r.Level1Wrapper), r.Level0Stmt).map(function (res) {
83
+ return Array.isArray(res) ? [res[0]].concat(_toConsumableArray(res[1])) : [res];
84
+ }).atMost(1).map(function (res) {
85
+ return res.length === 1 ? res[0] : res;
86
+ });
87
+ },
88
+ Level1Wrapper: function Level1Wrapper(r) {
89
+ return P.alt(P.seq(r.Level1Stmt.skip(KP.Comma), r.Level2Stmt), r.Level1Stmt).map(function (res) {
90
+ return Array.isArray(res) ? res : [res];
91
+ });
92
+ },
93
+ CommentSyntax: function CommentSyntax(r) {
94
+ return P.seqObj(r.StartComment, ['name', r.NameOption], KP.Comma, ['note', r.ValueOption], KP.Comma, ['level', r.Level0Wrapper], r.EndComment).map(A.handleComment).thru(makeNode());
95
+ }
96
+ });
97
+ module.exports = Lang.CommentSyntax;
@@ -6,8 +6,11 @@ var pCreateIndex = require('./create_index/index');
6
6
 
7
7
  var pCreateTable = require('./create_table');
8
8
 
9
+ var pCommentSyntax = require('./comments');
10
+
9
11
  module.exports = {
10
12
  pAlterTable: pAlterTable,
11
13
  pCreateIndex: pCreateIndex,
12
- pCreateTable: pCreateTable
14
+ pCreateTable: pCreateTable,
15
+ pCommentSyntax: pCommentSyntax
13
16
  };
@@ -34,20 +34,20 @@ Rule = (Expr)* {
34
34
  return {tables, refs, enums};
35
35
  }
36
36
 
37
- Expr =
37
+ Expr =
38
38
  t:TableSyntax { tables.push(t) }
39
39
  /AlterSyntax
40
40
  /IndexSyntax
41
41
  /IgnoreSyntax
42
42
  /__
43
-
43
+
44
44
  // TableSyntax: support "CREATE TABLE" syntax.
45
45
  // Try to support as mush as possible syntax in MySQL offical documents.
46
46
  // https://dev.mysql.com/doc/refman/8.0/en/create-table.html
47
47
  // Return: table object: {name, schemaName, fields, [,indexes]}
48
- TableSyntax
49
- = create_table (__ if_not_exist)? __ table_name:table_name _
50
- "(" _ body:TableBody _ ")" _ TableOptions? _ semicolon endline?
48
+ TableSyntax
49
+ = create_table (__ if_not_exist)? __ table_name:table_name _
50
+ "(" _ body:TableBody _ ")" _ options:TableOptions? _ semicolon endline?
51
51
  {
52
52
  const fields = body.fields;
53
53
  const indexes = body.indexes;
@@ -68,7 +68,7 @@ TableSyntax
68
68
  });
69
69
 
70
70
  const _enum = {
71
- name: `${table_name.schemaName
71
+ name: `${table_name.schemaName
72
72
  ? `${table_name.schemaName}_` : ''}${table_name.name}_${field.name}_enum`,
73
73
  values
74
74
  };
@@ -84,10 +84,12 @@ TableSyntax
84
84
  refs.push(ref);
85
85
  });
86
86
 
87
- // return statement
88
- return indexes ?
89
- {...table_name, fields, indexes}
90
- : {...table_name, fields}
87
+ let res = {...table_name, fields};
88
+
89
+ if (options && options.comment) res.note = options.comment;
90
+ if (indexes) res.indexes = indexes;
91
+ // return statement
92
+ return res;
91
93
  }
92
94
 
93
95
  // TableBody: this is the part between parenthesis.
@@ -416,6 +418,7 @@ IgnoreSyntax
416
418
  / BeginSyntax
417
419
  / CommitSyntax
418
420
  / RollbackSyntax
421
+ / "ALTER"i _ (comment / !(semicolon) .)*
419
422
  ) semicolon newline?
420
423
 
421
424
  // InsertSyntax: "INSERTO INTO" syntax