datagrok-tools 4.8.4 → 4.10.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.
- package/README.md +1 -1
- package/bin/commands/add.js +48 -140
- package/bin/commands/api.js +5 -61
- package/bin/commands/check.js +43 -154
- package/bin/commands/config.js +0 -60
- package/bin/commands/create.js +11 -71
- package/bin/commands/help.js +2 -4
- package/bin/commands/init.js +2 -81
- package/bin/commands/link.js +127 -172
- package/bin/commands/publish.js +14 -87
- package/bin/commands/test.js +2 -57
- package/bin/grok.js +0 -1
- package/bin/utils/color-utils.js +0 -6
- package/bin/utils/ent-helpers.js +2 -13
- package/bin/utils/func-generation.js +189 -0
- package/bin/utils/test-utils.js +7 -61
- package/bin/utils/utils.js +1 -48
- package/bin/validators/config-validator.js +2 -15
- package/package-template/.eslintrc.json +1 -1
- package/package-template/ts.webpack.config.js +4 -0
- package/package-template/tsconfig.json +3 -3
- package/package.json +6 -3
- package/plugins/func-gen-plugin.js +144 -0
- package/tsconfig.json +2 -2
- package/bin/validators/interfaces.js +0 -1
package/README.md
CHANGED
|
@@ -118,4 +118,4 @@ Read more about package development in [Datagrok's documentation](https://datagr
|
|
|
118
118
|
save a test run result, add the `--csv` flag (the report will be saved in a
|
|
119
119
|
CSV file in the package folder). You can find more details in [local package testing
|
|
120
120
|
instructions](https://datagrok.ai/help/develop/how-to/test-packages#local-testing).
|
|
121
|
-
- `link`
|
|
121
|
+
- `link` command is used for public plugins development to link `datagrok-api` and libraries.
|
package/bin/commands/add.js
CHANGED
|
@@ -1,62 +1,39 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
-
|
|
7
5
|
Object.defineProperty(exports, "__esModule", {
|
|
8
6
|
value: true
|
|
9
7
|
});
|
|
10
8
|
exports.add = add;
|
|
11
|
-
|
|
12
9
|
var _fs = _interopRequireDefault(require("fs"));
|
|
13
|
-
|
|
14
10
|
var _path = _interopRequireDefault(require("path"));
|
|
15
|
-
|
|
16
11
|
var _entHelpers = require("../utils/ent-helpers");
|
|
17
|
-
|
|
18
12
|
var utils = _interopRequireWildcard(require("../utils/utils"));
|
|
19
|
-
|
|
20
13
|
var color = _interopRequireWildcard(require("../utils/color-utils"));
|
|
21
|
-
|
|
22
14
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
23
|
-
|
|
24
15
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
25
|
-
|
|
26
16
|
function add(args) {
|
|
27
17
|
var nOptions = Object.keys(args).length - 1;
|
|
28
18
|
var nArgs = args['_'].length;
|
|
29
19
|
if (nArgs < 2 || nArgs > 5 || nOptions > 0) return false;
|
|
30
20
|
var entity = args['_'][1];
|
|
31
21
|
var curDir = process.cwd();
|
|
32
|
-
|
|
33
22
|
var curFolder = _path["default"].basename(curDir);
|
|
34
|
-
|
|
35
23
|
var srcDir = _path["default"].join(curDir, 'src');
|
|
36
|
-
|
|
37
24
|
var jsPath = _path["default"].join(srcDir, 'package.js');
|
|
38
|
-
|
|
39
25
|
var tsPath = _path["default"].join(srcDir, 'package.ts');
|
|
40
|
-
|
|
41
26
|
var detectorsPath = _path["default"].join(curDir, 'detectors.js');
|
|
42
|
-
|
|
43
27
|
var webpackConfigPath = _path["default"].join(curDir, 'webpack.config.js');
|
|
44
|
-
|
|
45
28
|
var scriptsDir = _path["default"].join(curDir, 'scripts');
|
|
46
|
-
|
|
47
29
|
var queryDir = _path["default"].join(curDir, 'queries');
|
|
48
|
-
|
|
49
30
|
var queryPath = _path["default"].join(queryDir, 'queries.sql');
|
|
50
|
-
|
|
51
31
|
var connectDir = _path["default"].join(curDir, 'connections');
|
|
52
|
-
|
|
53
32
|
var packagePath = _path["default"].join(curDir, 'package.json');
|
|
33
|
+
var templateDir = _path["default"].join(_path["default"].dirname(_path["default"].dirname(__dirname)));
|
|
54
34
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
35
|
+
// Package directory check
|
|
58
36
|
if (!_fs["default"].existsSync(packagePath)) return color.error('`package.json` not found');
|
|
59
|
-
|
|
60
37
|
try {
|
|
61
38
|
var _package = JSON.parse(_fs["default"].readFileSync(packagePath, {
|
|
62
39
|
encoding: 'utf-8'
|
|
@@ -64,172 +41,145 @@ function add(args) {
|
|
|
64
41
|
} catch (error) {
|
|
65
42
|
color.error("Error while reading ".concat(packagePath, ":"));
|
|
66
43
|
console.error(error);
|
|
67
|
-
}
|
|
68
|
-
|
|
44
|
+
}
|
|
69
45
|
|
|
46
|
+
// TypeScript package check
|
|
70
47
|
var ts = _fs["default"].existsSync(_path["default"].join(curDir, 'tsconfig.json'));
|
|
71
|
-
|
|
72
48
|
var packageEntry = ts ? tsPath : jsPath;
|
|
73
49
|
var ext = ts ? '.ts' : '.js';
|
|
74
|
-
|
|
75
50
|
function validateName(name) {
|
|
76
51
|
if (!/^([A-Za-z])+([A-Za-z\d])*$/.test(name)) {
|
|
77
52
|
return color.error('The name may only include letters and numbers. It cannot start with a digit');
|
|
78
53
|
}
|
|
79
|
-
|
|
80
54
|
return true;
|
|
81
55
|
}
|
|
82
|
-
|
|
83
56
|
function insertName(name, data) {
|
|
84
57
|
for (var _i = 0, _arr = ['NAME', 'NAME_TITLECASE', 'NAME_LOWERCASE']; _i < _arr.length; _i++) {
|
|
85
58
|
var repl = _arr[_i];
|
|
86
59
|
data = utils.replacers[repl](data, name);
|
|
87
60
|
}
|
|
88
|
-
|
|
89
61
|
return data;
|
|
90
62
|
}
|
|
91
|
-
|
|
92
63
|
function createPackageEntryFile() {
|
|
93
64
|
if (!_fs["default"].existsSync(srcDir)) _fs["default"].mkdirSync(srcDir);
|
|
94
|
-
|
|
95
65
|
if (!_fs["default"].existsSync(packageEntry)) {
|
|
96
66
|
var _contents = _fs["default"].readFileSync(_path["default"].join(templateDir, 'package-template', 'src', 'package.js'), 'utf8');
|
|
97
|
-
|
|
98
67
|
_fs["default"].writeFileSync(packageEntry, _contents, 'utf8');
|
|
99
68
|
}
|
|
100
69
|
}
|
|
101
|
-
|
|
102
70
|
var name;
|
|
103
71
|
var tag;
|
|
104
72
|
var contents;
|
|
105
|
-
|
|
106
73
|
switch (entity) {
|
|
107
74
|
case 'script':
|
|
108
75
|
if (nArgs < 4 || nArgs > 5) return false;
|
|
109
76
|
var lang = args['_'][2];
|
|
110
77
|
name = args['_'][3];
|
|
111
|
-
|
|
112
78
|
if (nArgs === 5) {
|
|
113
79
|
tag = args['_'][2];
|
|
114
80
|
lang = args['_'][3];
|
|
115
81
|
name = args['_'][4];
|
|
116
82
|
}
|
|
117
|
-
|
|
118
83
|
if (!Object.keys(utils.scriptLangExtMap).includes(lang)) {
|
|
119
84
|
color.error("Unsupported language: ".concat(lang));
|
|
120
85
|
console.log('You can add a script in one of the following languages:');
|
|
121
86
|
console.log(Object.keys(utils.scriptLangExtMap).join(', '));
|
|
122
87
|
return false;
|
|
123
|
-
}
|
|
124
|
-
|
|
88
|
+
}
|
|
125
89
|
|
|
90
|
+
// Script name check
|
|
126
91
|
if (!validateName(name)) return false;
|
|
127
|
-
if (tag && tag !== 'panel') return color.error('Currently, you can only add the `panel` tag');
|
|
92
|
+
if (tag && tag !== 'panel') return color.error('Currently, you can only add the `panel` tag');
|
|
128
93
|
|
|
94
|
+
// Create the folder `scripts` if it doesn't exist yet
|
|
129
95
|
if (!_fs["default"].existsSync(scriptsDir)) _fs["default"].mkdirSync(scriptsDir);
|
|
130
|
-
|
|
131
96
|
var scriptPath = _path["default"].join(scriptsDir, name + '.' + utils.scriptLangExtMap[lang]);
|
|
132
|
-
|
|
133
97
|
if (_fs["default"].existsSync(scriptPath)) {
|
|
134
98
|
return color.error("The file with the script already exists: ".concat(scriptPath));
|
|
135
|
-
}
|
|
136
|
-
|
|
99
|
+
}
|
|
137
100
|
|
|
101
|
+
// Copy the script template
|
|
138
102
|
var templatePath = _path["default"].join(templateDir, 'script-template');
|
|
139
|
-
|
|
140
103
|
templatePath = _path["default"].join(templatePath, lang + '.' + utils.scriptLangExtMap[lang]);
|
|
141
104
|
contents = _fs["default"].readFileSync(templatePath, 'utf8');
|
|
142
|
-
|
|
143
105
|
if (tag) {
|
|
144
106
|
var ind = contents.indexOf('tags: ') + 6;
|
|
145
107
|
contents = contents.slice(0, ind) + 'panel, ' + contents.slice(ind);
|
|
146
108
|
}
|
|
109
|
+
_fs["default"].writeFileSync(scriptPath, insertName(name, contents), 'utf8');
|
|
147
110
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
111
|
+
// Provide a JS wrapper for the script
|
|
151
112
|
console.log(_entHelpers.help.script(name, curFolder));
|
|
152
113
|
break;
|
|
153
|
-
|
|
154
114
|
case 'app':
|
|
155
|
-
if (nArgs !== 3) return false;
|
|
115
|
+
if (nArgs !== 3) return false;
|
|
156
116
|
|
|
117
|
+
// App name check
|
|
157
118
|
name = args['_'][2];
|
|
158
|
-
if (!validateName(name)) return false;
|
|
119
|
+
if (!validateName(name)) return false;
|
|
159
120
|
|
|
160
|
-
|
|
121
|
+
// Create src/package.js if it doesn't exist yet
|
|
122
|
+
createPackageEntryFile();
|
|
161
123
|
|
|
124
|
+
// Add an app template to package.js
|
|
162
125
|
var app = _fs["default"].readFileSync(_path["default"].join(templateDir, 'entity-template', 'app.js'), 'utf8');
|
|
163
|
-
|
|
164
126
|
_fs["default"].appendFileSync(packageEntry, insertName(name, app));
|
|
165
|
-
|
|
166
127
|
console.log(_entHelpers.help.app(name));
|
|
167
128
|
break;
|
|
168
|
-
|
|
169
129
|
case 'function':
|
|
170
130
|
if (nArgs < 3 || nArgs > 4) return false;
|
|
171
131
|
name = args['_'][2];
|
|
172
|
-
|
|
173
132
|
if (nArgs === 4) {
|
|
174
133
|
tag = args['_'][2];
|
|
175
134
|
name = args['_'][3];
|
|
176
135
|
}
|
|
177
|
-
|
|
178
136
|
if (!validateName(name)) return false;
|
|
179
|
-
|
|
180
137
|
if (tag && tag !== 'panel' && tag !== 'init') {
|
|
181
138
|
return color.error('Currently, you can only add the `panel` or `init` tag');
|
|
182
|
-
}
|
|
183
|
-
|
|
139
|
+
}
|
|
184
140
|
|
|
185
|
-
|
|
141
|
+
// Create src/package.js if it doesn't exist yet
|
|
142
|
+
createPackageEntryFile();
|
|
186
143
|
|
|
144
|
+
// Add a function to package.js
|
|
187
145
|
var filename = tag === 'panel' ? 'panel' + ext : tag === 'init' ? 'init.js' : 'function' + ext;
|
|
188
|
-
|
|
189
146
|
var func = _fs["default"].readFileSync(_path["default"].join(templateDir, 'entity-template', filename), 'utf8');
|
|
190
|
-
|
|
191
147
|
_fs["default"].appendFileSync(packageEntry, insertName(name, func));
|
|
192
|
-
|
|
193
148
|
console.log(_entHelpers.help.func(name, tag === 'panel'));
|
|
194
149
|
break;
|
|
195
|
-
|
|
196
150
|
case 'connection':
|
|
197
151
|
if (nArgs !== 3) return false;
|
|
198
|
-
name = args['_'][2];
|
|
152
|
+
name = args['_'][2];
|
|
199
153
|
|
|
200
|
-
|
|
154
|
+
// Connection name check
|
|
155
|
+
if (!validateName(name)) return false;
|
|
201
156
|
|
|
157
|
+
// Create the `connections` folder if it doesn't exist yet
|
|
202
158
|
if (!_fs["default"].existsSync(connectDir)) _fs["default"].mkdirSync(connectDir);
|
|
203
|
-
|
|
204
159
|
var connectPath = _path["default"].join(connectDir, "".concat(name, ".json"));
|
|
205
|
-
|
|
206
160
|
if (_fs["default"].existsSync(connectPath)) {
|
|
207
161
|
return color.error("The connection file already exists: ".concat(connectPath));
|
|
208
162
|
}
|
|
209
|
-
|
|
210
163
|
var connectionTemplate = _fs["default"].readFileSync(_path["default"].join(templateDir, 'entity-template', 'connection.json'), 'utf8');
|
|
211
|
-
|
|
212
164
|
_fs["default"].writeFileSync(connectPath, insertName(name, connectionTemplate), 'utf8');
|
|
213
|
-
|
|
214
165
|
console.log(_entHelpers.help.connection(name));
|
|
215
166
|
break;
|
|
216
|
-
|
|
217
167
|
case 'query':
|
|
218
|
-
if (nArgs !== 3) return false;
|
|
168
|
+
if (nArgs !== 3) return false;
|
|
219
169
|
|
|
170
|
+
// Query name check
|
|
220
171
|
name = args['_'][2];
|
|
221
|
-
if (!validateName(name)) return false;
|
|
172
|
+
if (!validateName(name)) return false;
|
|
222
173
|
|
|
223
|
-
|
|
174
|
+
// Create the `queries` folder if it doesn't exist yet
|
|
175
|
+
if (!_fs["default"].existsSync(queryDir)) _fs["default"].mkdirSync(queryDir);
|
|
224
176
|
|
|
177
|
+
// Add a query to queries.sql
|
|
225
178
|
var query = _fs["default"].readFileSync(_path["default"].join(templateDir, 'entity-template', 'queries.sql'), 'utf8');
|
|
226
|
-
|
|
227
179
|
contents = insertName(name, query);
|
|
228
180
|
var connection;
|
|
229
|
-
|
|
230
181
|
if (_fs["default"].existsSync(connectDir) && _fs["default"].readdirSync(connectDir).length !== 0) {
|
|
231
182
|
var _fs$readdirSync$find;
|
|
232
|
-
|
|
233
183
|
// Use the name of the first found connection
|
|
234
184
|
connection = (_fs$readdirSync$find = _fs["default"].readdirSync(connectDir).find(function (c) {
|
|
235
185
|
return /.+\.json$/.test(c);
|
|
@@ -238,139 +188,107 @@ function add(args) {
|
|
|
238
188
|
// Create the default connection file
|
|
239
189
|
if (!_fs["default"].existsSync(connectDir)) _fs["default"].mkdirSync(connectDir);
|
|
240
190
|
connection = _fs["default"].readFileSync(_path["default"].join(templateDir, 'entity-template', 'connection.json'), 'utf8');
|
|
241
|
-
|
|
242
191
|
_fs["default"].writeFileSync(_path["default"].join(connectDir, 'connection.json'), insertName('connection', connection), 'utf8');
|
|
243
|
-
|
|
244
192
|
connection = 'connection';
|
|
245
193
|
}
|
|
246
|
-
|
|
247
194
|
contents = contents.replace('#{CONNECTION}', connection);
|
|
248
|
-
|
|
249
195
|
_fs["default"].appendFileSync(queryPath, contents);
|
|
250
|
-
|
|
251
196
|
console.log(_entHelpers.help.query(name));
|
|
252
197
|
break;
|
|
253
|
-
|
|
254
198
|
case 'view':
|
|
255
|
-
if (nArgs !== 3) return false;
|
|
199
|
+
if (nArgs !== 3) return false;
|
|
256
200
|
|
|
201
|
+
// View name check
|
|
257
202
|
name = args['_'][2];
|
|
258
203
|
if (!validateName(name)) return false;
|
|
259
|
-
|
|
260
204
|
if (!name.endsWith('View')) {
|
|
261
205
|
color.warn("For consistency reasons, we recommend postfixing classes with 'View'");
|
|
262
|
-
}
|
|
263
|
-
|
|
206
|
+
}
|
|
264
207
|
|
|
265
|
-
|
|
208
|
+
// Create src/package.js if it doesn't exist yet
|
|
209
|
+
createPackageEntryFile();
|
|
266
210
|
|
|
211
|
+
// Add a new JS file with a view class
|
|
267
212
|
var viewPath = _path["default"].join(srcDir, utils.camelCaseToKebab(name) + ext);
|
|
268
|
-
|
|
269
213
|
if (_fs["default"].existsSync(viewPath)) {
|
|
270
214
|
return color.error("The view file already exists: ".concat(viewPath));
|
|
271
215
|
}
|
|
272
|
-
|
|
273
216
|
var viewClass = _fs["default"].readFileSync(_path["default"].join(templateDir, 'entity-template', 'view-class' + ext), 'utf8');
|
|
217
|
+
_fs["default"].writeFileSync(viewPath, insertName(name, viewClass), 'utf8');
|
|
274
218
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
219
|
+
// Add a view function to package.js
|
|
278
220
|
var view = _fs["default"].readFileSync(_path["default"].join(templateDir, 'entity-template', 'view.js'), 'utf8');
|
|
279
|
-
|
|
280
221
|
contents = insertName(name, "import {#{NAME}} from './".concat(utils.camelCaseToKebab(name), "';\n"));
|
|
281
222
|
contents += _fs["default"].readFileSync(packageEntry, 'utf8');
|
|
282
223
|
contents += insertName(name, view);
|
|
283
|
-
|
|
284
224
|
_fs["default"].writeFileSync(packageEntry, contents, 'utf8');
|
|
285
|
-
|
|
286
225
|
console.log(_entHelpers.help.view(name));
|
|
287
226
|
break;
|
|
288
|
-
|
|
289
227
|
case 'viewer':
|
|
290
|
-
if (nArgs !== 3) return false;
|
|
228
|
+
if (nArgs !== 3) return false;
|
|
291
229
|
|
|
230
|
+
// Viewer name check
|
|
292
231
|
name = args['_'][2];
|
|
293
232
|
if (!validateName(name)) return false;
|
|
294
|
-
|
|
295
233
|
if (!name.endsWith('Viewer')) {
|
|
296
234
|
color.warn("For consistency reasons, we recommend postfixing classes with 'Viewer'");
|
|
297
|
-
}
|
|
298
|
-
|
|
235
|
+
}
|
|
299
236
|
|
|
300
|
-
|
|
237
|
+
// Create src/package.js if it doesn't exist yet
|
|
238
|
+
createPackageEntryFile();
|
|
301
239
|
|
|
240
|
+
// Add a new JS file with a viewer class
|
|
302
241
|
var viewerPath = _path["default"].join(srcDir, utils.camelCaseToKebab(name) + ext);
|
|
303
|
-
|
|
304
242
|
if (_fs["default"].existsSync(viewerPath)) {
|
|
305
243
|
return color.error("The viewer file already exists: ".concat(viewerPath));
|
|
306
244
|
}
|
|
307
|
-
|
|
308
245
|
var viewerClass = _fs["default"].readFileSync(_path["default"].join(templateDir, 'entity-template', 'viewer-class' + ext), 'utf8');
|
|
246
|
+
_fs["default"].writeFileSync(viewerPath, insertName(name, viewerClass), 'utf8');
|
|
309
247
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
248
|
+
// Add a viewer function to package.js
|
|
313
249
|
var viewer = _fs["default"].readFileSync(_path["default"].join(templateDir, 'entity-template', 'viewer.js'), 'utf8');
|
|
314
|
-
|
|
315
250
|
contents = insertName(name, "import {#{NAME}} from './".concat(utils.camelCaseToKebab(name), "';\n"));
|
|
316
251
|
contents += _fs["default"].readFileSync(packageEntry, 'utf8');
|
|
317
252
|
contents += insertName(name, viewer);
|
|
318
|
-
|
|
319
253
|
_fs["default"].writeFileSync(packageEntry, contents, 'utf8');
|
|
320
|
-
|
|
321
254
|
console.log(_entHelpers.help.viewer(name));
|
|
322
255
|
break;
|
|
323
|
-
|
|
324
256
|
case 'detector':
|
|
325
257
|
if (nArgs !== 3) return false;
|
|
326
258
|
name = args['_'][2];
|
|
327
|
-
|
|
328
259
|
if (!_fs["default"].existsSync(detectorsPath)) {
|
|
329
260
|
var temp = _fs["default"].readFileSync(_path["default"].join(templateDir, 'package-template', 'detectors.js'), 'utf8');
|
|
330
|
-
|
|
331
261
|
temp = utils.replacers['PACKAGE_DETECTORS_NAME'](temp, curFolder);
|
|
332
|
-
|
|
333
262
|
_fs["default"].writeFileSync(detectorsPath, temp, 'utf8');
|
|
334
263
|
}
|
|
335
|
-
|
|
336
264
|
var detector = _fs["default"].readFileSync(_path["default"].join(templateDir, 'entity-template', 'sem-type-detector.js'), 'utf8');
|
|
337
|
-
|
|
338
265
|
contents = _fs["default"].readFileSync(detectorsPath, 'utf8');
|
|
339
266
|
var idx = contents.search(/(?<=PackageDetectors extends DG.Package\s*{\s*(\r\n|\r|\n)).*/);
|
|
340
267
|
if (idx === -1) return color.error('Detectors class not found');
|
|
341
268
|
contents = contents.slice(0, idx) + detector + contents.slice(idx);
|
|
342
|
-
|
|
343
269
|
for (var _i2 = 0, _arr2 = ['NAME', 'NAME_PREFIX', 'PACKAGE_DETECTORS_NAME']; _i2 < _arr2.length; _i2++) {
|
|
344
270
|
var repl = _arr2[_i2];
|
|
345
271
|
contents = utils.replacers[repl](contents, name);
|
|
346
272
|
}
|
|
347
|
-
|
|
348
273
|
_fs["default"].writeFileSync(detectorsPath, contents, 'utf8');
|
|
349
|
-
|
|
350
274
|
console.log(_entHelpers.help.detector(name));
|
|
351
275
|
break;
|
|
352
|
-
|
|
353
276
|
case 'tests':
|
|
354
277
|
if (!_fs["default"].existsSync(tsPath)) {
|
|
355
278
|
color.error('Only TypeScript packages are supported');
|
|
356
279
|
return false;
|
|
357
280
|
}
|
|
358
|
-
|
|
359
281
|
if (!_fs["default"].existsSync(webpackConfigPath)) {
|
|
360
282
|
color.error('Webpack configuration not found');
|
|
361
283
|
return false;
|
|
362
284
|
}
|
|
363
|
-
|
|
364
285
|
var config = _fs["default"].readFileSync(webpackConfigPath, 'utf8');
|
|
365
|
-
|
|
366
286
|
if (!/(?<=entry:\s*{\s*(\r\n|\r|\n))[^}]*test:/.test(config)) {
|
|
367
287
|
var entryIdx = config.search(/(?<=entry:\s*{\s*(\r\n|\r|\n)).*/);
|
|
368
288
|
if (entryIdx === -1) return color.error('Entry point not found during config parsing');
|
|
369
289
|
var testEntry = " test: {filename: 'package-test.js', library: " + "{type: 'var', name:`${packageName}_test`}, import: './src/package-test.ts'},";
|
|
370
|
-
|
|
371
290
|
_fs["default"].writeFileSync(webpackConfigPath, config.slice(0, entryIdx) + testEntry + config.slice(entryIdx), 'utf8');
|
|
372
291
|
}
|
|
373
|
-
|
|
374
292
|
var packageObj = JSON.parse(_fs["default"].readFileSync(packagePath, 'utf8'));
|
|
375
293
|
Object.assign(packageObj.dependencies, {
|
|
376
294
|
'@datagrok-libraries/utils': 'latest'
|
|
@@ -378,27 +296,17 @@ function add(args) {
|
|
|
378
296
|
Object.assign(packageObj.scripts, {
|
|
379
297
|
'test': 'grok test'
|
|
380
298
|
});
|
|
381
|
-
|
|
382
299
|
_fs["default"].writeFileSync(packagePath, JSON.stringify(packageObj, null, 2), 'utf8');
|
|
383
|
-
|
|
384
300
|
var packageTestPath = _path["default"].join(srcDir, 'package-test.ts');
|
|
385
|
-
|
|
386
301
|
if (!_fs["default"].existsSync(packageTestPath)) _fs["default"].writeFileSync(packageTestPath, _fs["default"].readFileSync(_path["default"].join(templateDir, 'package-template', 'src', 'package-test.ts')));
|
|
387
|
-
|
|
388
302
|
var testsDir = _path["default"].join(srcDir, 'tests');
|
|
389
|
-
|
|
390
303
|
if (!_fs["default"].existsSync(testsDir)) _fs["default"].mkdirSync(testsDir);
|
|
391
|
-
|
|
392
304
|
_fs["default"].writeFileSync(_path["default"].join(testsDir, 'test-examples.ts'), _fs["default"].readFileSync(_path["default"].join(templateDir, 'entity-template', 'test.ts')));
|
|
393
|
-
|
|
394
305
|
_fs["default"].writeFileSync(packageTestPath, "import './tests/test-examples';\n" + _fs["default"].readFileSync(packageTestPath));
|
|
395
|
-
|
|
396
306
|
console.log(_entHelpers.help.test(testsDir));
|
|
397
307
|
break;
|
|
398
|
-
|
|
399
308
|
default:
|
|
400
309
|
return false;
|
|
401
310
|
}
|
|
402
|
-
|
|
403
311
|
return true;
|
|
404
312
|
}
|
package/bin/commands/api.js
CHANGED
|
@@ -1,80 +1,54 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
-
|
|
7
5
|
Object.defineProperty(exports, "__esModule", {
|
|
8
6
|
value: true
|
|
9
7
|
});
|
|
10
8
|
exports.api = api;
|
|
11
|
-
|
|
12
9
|
var _fs = _interopRequireDefault(require("fs"));
|
|
13
|
-
|
|
14
10
|
var _path = _interopRequireDefault(require("path"));
|
|
15
|
-
|
|
16
11
|
var _ignoreWalk = _interopRequireDefault(require("ignore-walk"));
|
|
17
|
-
|
|
18
12
|
var utils = _interopRequireWildcard(require("../utils/utils"));
|
|
19
|
-
|
|
20
13
|
var color = _interopRequireWildcard(require("../utils/color-utils"));
|
|
21
|
-
|
|
22
14
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
23
|
-
|
|
24
15
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
25
|
-
|
|
26
16
|
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
|
|
27
|
-
|
|
28
17
|
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); }
|
|
29
|
-
|
|
30
18
|
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; }
|
|
31
|
-
|
|
32
19
|
function generateQueryWrappers() {
|
|
33
20
|
var curDir = process.cwd();
|
|
34
|
-
|
|
35
21
|
var queriesDir = _path["default"].join(curDir, 'queries');
|
|
36
|
-
|
|
37
22
|
if (!_fs["default"].existsSync(queriesDir)) {
|
|
38
23
|
color.warn("Directory ".concat(queriesDir, " not found"));
|
|
39
24
|
console.log('Skipping API generation for queries...');
|
|
40
25
|
return;
|
|
41
26
|
}
|
|
42
|
-
|
|
43
27
|
var packagePath = _path["default"].join(curDir, 'package.json');
|
|
44
|
-
|
|
45
28
|
var _package = JSON.parse(_fs["default"].readFileSync(packagePath, {
|
|
46
29
|
encoding: 'utf-8'
|
|
47
30
|
}));
|
|
48
|
-
|
|
49
31
|
var files = _ignoreWalk["default"].sync({
|
|
50
32
|
path: './queries',
|
|
51
33
|
ignoreFiles: ['.npmignore', '.gitignore']
|
|
52
34
|
});
|
|
53
|
-
|
|
54
35
|
var wrappers = [];
|
|
55
|
-
|
|
56
36
|
var _iterator = _createForOfIteratorHelper(files),
|
|
57
|
-
|
|
58
|
-
|
|
37
|
+
_step;
|
|
59
38
|
try {
|
|
60
39
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
61
40
|
var file = _step.value;
|
|
62
41
|
if (!file.endsWith(utils.queryExtension)) continue;
|
|
63
|
-
|
|
64
42
|
var filepath = _path["default"].join(queriesDir, file);
|
|
65
|
-
|
|
66
43
|
var script = _fs["default"].readFileSync(filepath, 'utf8');
|
|
67
|
-
|
|
68
44
|
if (!script) continue;
|
|
69
45
|
var queries = script.split('--end').map(function (q) {
|
|
70
46
|
return q.trim();
|
|
71
47
|
}).filter(function (q) {
|
|
72
48
|
return q.length > 0;
|
|
73
49
|
});
|
|
74
|
-
|
|
75
50
|
var _iterator2 = _createForOfIteratorHelper(queries),
|
|
76
|
-
|
|
77
|
-
|
|
51
|
+
_step2;
|
|
78
52
|
try {
|
|
79
53
|
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
80
54
|
var q = _step2.value;
|
|
@@ -83,7 +57,8 @@ function generateQueryWrappers() {
|
|
|
83
57
|
var tb = new utils.TemplateBuilder(utils.queryWrapperTemplate).replace('FUNC_NAME', name).replace('FUNC_NAME_LOWERCASE', name).replace('PACKAGE_NAMESPACE', _package.name);
|
|
84
58
|
var inputs = utils.getScriptInputs(q, utils.commentMap[utils.queryExtension]);
|
|
85
59
|
var outputType = utils.getScriptOutputType(q, utils.commentMap[utils.queryExtension]);
|
|
86
|
-
tb.replace('PARAMS_OBJECT', inputs).replace('TYPED_PARAMS', inputs)
|
|
60
|
+
tb.replace('PARAMS_OBJECT', inputs).replace('TYPED_PARAMS', inputs)
|
|
61
|
+
// The query output, if omitted, is a dataframe
|
|
87
62
|
.replace('OUTPUT_TYPE', outputType === 'void' ? utils.dgToTsTypeMap['dataframe'] : outputType);
|
|
88
63
|
wrappers.push(tb.build());
|
|
89
64
|
}
|
|
@@ -98,52 +73,36 @@ function generateQueryWrappers() {
|
|
|
98
73
|
} finally {
|
|
99
74
|
_iterator.f();
|
|
100
75
|
}
|
|
101
|
-
|
|
102
76
|
var srcDir = _path["default"].join(curDir, 'src');
|
|
103
|
-
|
|
104
77
|
var queryFileName = 'queries-api.ts';
|
|
105
|
-
|
|
106
78
|
var queryFilePath = _path["default"].join(_fs["default"].existsSync(srcDir) ? srcDir : curDir, queryFileName);
|
|
107
|
-
|
|
108
79
|
if (_fs["default"].existsSync(queryFilePath)) {
|
|
109
80
|
color.warn("The file ".concat(queryFilePath, " already exists"));
|
|
110
81
|
console.log('Rewriting its contents...');
|
|
111
82
|
}
|
|
112
|
-
|
|
113
83
|
var sep = '\n';
|
|
114
|
-
|
|
115
84
|
_fs["default"].writeFileSync(queryFilePath, utils.dgImports + sep + wrappers.join(sep.repeat(2)) + sep, 'utf8');
|
|
116
|
-
|
|
117
85
|
color.success("Successfully generated file ".concat(queryFileName).concat(sep));
|
|
118
86
|
}
|
|
119
|
-
|
|
120
87
|
function generateScriptWrappers() {
|
|
121
88
|
var curDir = process.cwd();
|
|
122
|
-
|
|
123
89
|
var scriptsDir = _path["default"].join(curDir, 'scripts');
|
|
124
|
-
|
|
125
90
|
if (!_fs["default"].existsSync(scriptsDir)) {
|
|
126
91
|
color.warn("Directory ".concat(scriptsDir, " not found"));
|
|
127
92
|
console.log('Skipping API generation for scripts...');
|
|
128
93
|
return;
|
|
129
94
|
}
|
|
130
|
-
|
|
131
95
|
var packagePath = _path["default"].join(curDir, 'package.json');
|
|
132
|
-
|
|
133
96
|
var _package = JSON.parse(_fs["default"].readFileSync(packagePath, {
|
|
134
97
|
encoding: 'utf-8'
|
|
135
98
|
}));
|
|
136
|
-
|
|
137
99
|
var files = _ignoreWalk["default"].sync({
|
|
138
100
|
path: './scripts',
|
|
139
101
|
ignoreFiles: ['.npmignore', '.gitignore']
|
|
140
102
|
});
|
|
141
|
-
|
|
142
103
|
var wrappers = [];
|
|
143
|
-
|
|
144
104
|
var _iterator3 = _createForOfIteratorHelper(files),
|
|
145
|
-
|
|
146
|
-
|
|
105
|
+
_step3;
|
|
147
106
|
try {
|
|
148
107
|
var _loop = function _loop() {
|
|
149
108
|
var file = _step3.value;
|
|
@@ -151,11 +110,8 @@ function generateScriptWrappers() {
|
|
|
151
110
|
if (!utils.scriptExtensions.some(function (ext) {
|
|
152
111
|
return extension = ext, file.endsWith(ext);
|
|
153
112
|
})) return "continue";
|
|
154
|
-
|
|
155
113
|
var filepath = _path["default"].join(scriptsDir, file);
|
|
156
|
-
|
|
157
114
|
var script = _fs["default"].readFileSync(filepath, 'utf8');
|
|
158
|
-
|
|
159
115
|
if (!script) return "continue";
|
|
160
116
|
var name = utils.getScriptName(script, utils.commentMap[extension]);
|
|
161
117
|
if (!name) return "continue";
|
|
@@ -165,10 +121,8 @@ function generateScriptWrappers() {
|
|
|
165
121
|
tb.replace('PARAMS_OBJECT', inputs).replace('TYPED_PARAMS', inputs).replace('OUTPUT_TYPE', outputType);
|
|
166
122
|
wrappers.push(tb.build(1));
|
|
167
123
|
};
|
|
168
|
-
|
|
169
124
|
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
170
125
|
var _ret = _loop();
|
|
171
|
-
|
|
172
126
|
if (_ret === "continue") continue;
|
|
173
127
|
}
|
|
174
128
|
} catch (err) {
|
|
@@ -176,35 +130,25 @@ function generateScriptWrappers() {
|
|
|
176
130
|
} finally {
|
|
177
131
|
_iterator3.f();
|
|
178
132
|
}
|
|
179
|
-
|
|
180
133
|
var srcDir = _path["default"].join(curDir, 'src');
|
|
181
|
-
|
|
182
134
|
var funcFileName = 'scripts-api.ts';
|
|
183
|
-
|
|
184
135
|
var funcFilePath = _path["default"].join(_fs["default"].existsSync(srcDir) ? srcDir : curDir, funcFileName);
|
|
185
|
-
|
|
186
136
|
if (_fs["default"].existsSync(funcFilePath)) {
|
|
187
137
|
color.warn("The file ".concat(funcFilePath, " already exists"));
|
|
188
138
|
console.log('Rewriting its contents...');
|
|
189
139
|
}
|
|
190
|
-
|
|
191
140
|
var sep = '\n';
|
|
192
141
|
var scriptApi = new utils.TemplateBuilder(utils.namespaceTemplate).replace('PACKAGE_NAMESPACE', _package.name).replace('NAME', wrappers.join(sep.repeat(2)));
|
|
193
|
-
|
|
194
142
|
_fs["default"].writeFileSync(funcFilePath, utils.dgImports + sep + scriptApi.build() + sep, 'utf8');
|
|
195
|
-
|
|
196
143
|
color.success("Successfully generated file ".concat(funcFileName).concat(sep));
|
|
197
144
|
}
|
|
198
|
-
|
|
199
145
|
function api(args) {
|
|
200
146
|
var nOptions = Object.keys(args).length - 1;
|
|
201
147
|
if (args['_'].length !== 1 || nOptions > 0) return false;
|
|
202
|
-
|
|
203
148
|
if (!utils.isPackageDir(process.cwd())) {
|
|
204
149
|
color.error('File `package.json` not found. Run the command from the package directory');
|
|
205
150
|
return false;
|
|
206
151
|
}
|
|
207
|
-
|
|
208
152
|
generateScriptWrappers();
|
|
209
153
|
generateQueryWrappers();
|
|
210
154
|
return true;
|