@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.
- package/lib/export/DbmlExporter.js +2 -5
- package/lib/parse/mssql/keyword_parsers.js +12 -1
- package/lib/parse/mssql/statements/actions.js +28 -0
- package/lib/parse/mssql/statements/index.js +1 -1
- package/lib/parse/mssql/statements/statement_types/comments/actions.js +57 -0
- package/lib/parse/mssql/statements/statement_types/comments/index.js +97 -0
- package/lib/parse/mssql/statements/statement_types/index.js +4 -1
- package/lib/parse/mysql/parser.pegjs +13 -10
- package/lib/parse/mysqlParser.js +267 -144
- package/lib/parse/postgresParser.js +12 -12
- package/lib/parse/postgresql/Commands/Alter_table/Alter_table.pegjs +47 -3
- package/lib/parse/postgresql/Commands/Comment.pegjs +18 -6
- package/lib/parse/postgresql/Commands/Ignore_syntax.pegjs +10 -1
- package/lib/parse/postgresql/InitializerUtils.pegjs +4 -2
- package/lib/parse/postgresql/Keywords.pegjs +5 -1
- package/lib/parse/postgresql/parser.pegjs +20 -7
- package/package.json +2 -2
|
@@ -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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|