datagrok-tools 4.1.16 → 4.1.20
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/bin/commands/add.js +2 -2
- package/bin/commands/api.js +14 -5
- package/bin/commands/config.js +207 -101
- package/bin/commands/help.js +1 -1
- package/bin/utils/ent-helpers.js +1 -1
- package/bin/utils/utils.js +24 -12
- package/entity-template/view-class.ts +1 -1
- package/package-template/.eslintrc.json +10 -1
- package/package.json +2 -1
- package/src/test-utils.ts +0 -84
package/bin/commands/add.js
CHANGED
|
@@ -271,7 +271,7 @@ function add(args) {
|
|
|
271
271
|
|
|
272
272
|
var view = _fs["default"].readFileSync(_path["default"].join(_path["default"].dirname(_path["default"].dirname(__dirname)), 'entity-template', 'view.js'), 'utf8');
|
|
273
273
|
|
|
274
|
-
contents = insertName(name, "import {#{NAME}} from '
|
|
274
|
+
contents = insertName(name, "import {#{NAME}} from './".concat(utils.camelCaseToKebab(name), "';\n"));
|
|
275
275
|
contents += _fs["default"].readFileSync(packageEntry, 'utf8');
|
|
276
276
|
contents += insertName(name, view);
|
|
277
277
|
|
|
@@ -306,7 +306,7 @@ function add(args) {
|
|
|
306
306
|
|
|
307
307
|
var viewer = _fs["default"].readFileSync(_path["default"].join(_path["default"].dirname(_path["default"].dirname(__dirname)), 'entity-template', 'viewer.js'), 'utf8');
|
|
308
308
|
|
|
309
|
-
contents = insertName(name, "import {#{NAME}} from '
|
|
309
|
+
contents = insertName(name, "import {#{NAME}} from './".concat(utils.camelCaseToKebab(name), "';\n"));
|
|
310
310
|
contents += _fs["default"].readFileSync(packageEntry, 'utf8');
|
|
311
311
|
contents += insertName(name, viewer);
|
|
312
312
|
|
package/bin/commands/api.js
CHANGED
|
@@ -77,7 +77,7 @@ function generateQueryWrappers() {
|
|
|
77
77
|
var q = _step2.value;
|
|
78
78
|
var name = utils.getScriptName(q, utils.commentMap[utils.queryExtension]);
|
|
79
79
|
if (!name) continue;
|
|
80
|
-
var tb = new utils.TemplateBuilder(utils.queryWrapperTemplate).replace('
|
|
80
|
+
var tb = new utils.TemplateBuilder(utils.queryWrapperTemplate).replace('FUNC_NAME', name).replace('FUNC_NAME_LOWERCASE', name).replace('PACKAGE_NAMESPACE', _package.name);
|
|
81
81
|
var inputs = utils.getScriptInputs(q, utils.commentMap[utils.queryExtension]);
|
|
82
82
|
var outputType = utils.getScriptOutputType(q, utils.commentMap[utils.queryExtension]);
|
|
83
83
|
tb.replace('PARAMS_OBJECT', inputs).replace('TYPED_PARAMS', inputs) // The query output, if omitted, is a dataframe
|
|
@@ -98,7 +98,9 @@ function generateQueryWrappers() {
|
|
|
98
98
|
|
|
99
99
|
var srcDir = _path["default"].join(curDir, 'src');
|
|
100
100
|
|
|
101
|
-
var
|
|
101
|
+
var queryFileName = 'queries-api.ts';
|
|
102
|
+
|
|
103
|
+
var queryFilePath = _path["default"].join(_fs["default"].existsSync(srcDir) ? srcDir : curDir, queryFileName);
|
|
102
104
|
|
|
103
105
|
if (_fs["default"].existsSync(queryFilePath)) {
|
|
104
106
|
console.log("The file ".concat(queryFilePath, " already exists\nRewriting its contents..."));
|
|
@@ -107,6 +109,8 @@ function generateQueryWrappers() {
|
|
|
107
109
|
var sep = '\n';
|
|
108
110
|
|
|
109
111
|
_fs["default"].writeFileSync(queryFilePath, utils.dgImports + sep + wrappers.join(sep.repeat(2)) + sep, 'utf8');
|
|
112
|
+
|
|
113
|
+
console.log("Successfully generated file ".concat(queryFileName).concat(sep));
|
|
110
114
|
}
|
|
111
115
|
|
|
112
116
|
function generateScriptWrappers() {
|
|
@@ -154,7 +158,7 @@ function generateScriptWrappers() {
|
|
|
154
158
|
var inputs = utils.getScriptInputs(script);
|
|
155
159
|
var outputType = utils.getScriptOutputType(script);
|
|
156
160
|
tb.replace('PARAMS_OBJECT', inputs).replace('TYPED_PARAMS', inputs).replace('OUTPUT_TYPE', outputType);
|
|
157
|
-
wrappers.push(tb.build());
|
|
161
|
+
wrappers.push(tb.build(1));
|
|
158
162
|
};
|
|
159
163
|
|
|
160
164
|
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
@@ -170,15 +174,20 @@ function generateScriptWrappers() {
|
|
|
170
174
|
|
|
171
175
|
var srcDir = _path["default"].join(curDir, 'src');
|
|
172
176
|
|
|
173
|
-
var
|
|
177
|
+
var funcFileName = 'scripts-api.ts';
|
|
178
|
+
|
|
179
|
+
var funcFilePath = _path["default"].join(_fs["default"].existsSync(srcDir) ? srcDir : curDir, funcFileName);
|
|
174
180
|
|
|
175
181
|
if (_fs["default"].existsSync(funcFilePath)) {
|
|
176
182
|
console.log("The file ".concat(funcFilePath, " already exists\nRewriting its contents..."));
|
|
177
183
|
}
|
|
178
184
|
|
|
179
185
|
var sep = '\n';
|
|
186
|
+
var scriptApi = new utils.TemplateBuilder(utils.namespaceTemplate).replace('PACKAGE_NAMESPACE', _package.name).replace('NAME', wrappers.join(sep.repeat(2)));
|
|
187
|
+
|
|
188
|
+
_fs["default"].writeFileSync(funcFilePath, utils.dgImports + sep + scriptApi.build() + sep, 'utf8');
|
|
180
189
|
|
|
181
|
-
|
|
190
|
+
console.log("Successfully generated file ".concat(funcFileName).concat(sep));
|
|
182
191
|
}
|
|
183
192
|
|
|
184
193
|
function api(args) {
|
package/bin/commands/config.js
CHANGED
|
@@ -46,127 +46,233 @@ function generateKeyQ(server, url) {
|
|
|
46
46
|
var question = {
|
|
47
47
|
name: server,
|
|
48
48
|
type: 'input',
|
|
49
|
-
message: "Developer key (get it from ".concat(origin, "/u):"),
|
|
49
|
+
message: "Developer key (get it from ".concat(origin, "/u or press ENTER to skip):"),
|
|
50
50
|
validate: validateKey
|
|
51
51
|
};
|
|
52
52
|
|
|
53
53
|
if (server.startsWith('local')) {
|
|
54
|
-
question.message = "Developer key for ".concat(origin);
|
|
54
|
+
question.message = "Developer key for ".concat(origin, " (press ENTER to skip):");
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
return question;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
+
function addNewServer(_x) {
|
|
61
|
+
return _addNewServer.apply(this, arguments);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function _addNewServer() {
|
|
65
|
+
_addNewServer = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(config) {
|
|
66
|
+
var addServer, name, url, key;
|
|
67
|
+
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
68
|
+
while (1) {
|
|
69
|
+
switch (_context2.prev = _context2.next) {
|
|
70
|
+
case 0:
|
|
71
|
+
if (!true) {
|
|
72
|
+
_context2.next = 21;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
_context2.next = 3;
|
|
77
|
+
return _inquirer["default"].prompt({
|
|
78
|
+
name: 'add-server',
|
|
79
|
+
type: 'confirm',
|
|
80
|
+
message: 'Do you want to add a server?',
|
|
81
|
+
"default": false
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
case 3:
|
|
85
|
+
addServer = _context2.sent['add-server'];
|
|
86
|
+
|
|
87
|
+
if (!addServer) {
|
|
88
|
+
_context2.next = 18;
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
_context2.next = 7;
|
|
93
|
+
return _inquirer["default"].prompt({
|
|
94
|
+
name: 'server-name',
|
|
95
|
+
type: 'input',
|
|
96
|
+
message: 'Enter a name:'
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
case 7:
|
|
100
|
+
name = _context2.sent['server-name'];
|
|
101
|
+
_context2.next = 10;
|
|
102
|
+
return _inquirer["default"].prompt({
|
|
103
|
+
name: 'server-url',
|
|
104
|
+
type: 'input',
|
|
105
|
+
message: 'Enter a URL:'
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
case 10:
|
|
109
|
+
url = _context2.sent['server-url'];
|
|
110
|
+
_context2.next = 13;
|
|
111
|
+
return _inquirer["default"].prompt(generateKeyQ(name, url));
|
|
112
|
+
|
|
113
|
+
case 13:
|
|
114
|
+
_context2.t0 = name;
|
|
115
|
+
key = _context2.sent[_context2.t0];
|
|
116
|
+
config.servers[name] = {
|
|
117
|
+
url: url,
|
|
118
|
+
key: key
|
|
119
|
+
};
|
|
120
|
+
_context2.next = 19;
|
|
121
|
+
break;
|
|
122
|
+
|
|
123
|
+
case 18:
|
|
124
|
+
return _context2.abrupt("break", 21);
|
|
125
|
+
|
|
126
|
+
case 19:
|
|
127
|
+
_context2.next = 0;
|
|
128
|
+
break;
|
|
129
|
+
|
|
130
|
+
case 21:
|
|
131
|
+
case "end":
|
|
132
|
+
return _context2.stop();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}, _callee2);
|
|
136
|
+
}));
|
|
137
|
+
return _addNewServer.apply(this, arguments);
|
|
138
|
+
}
|
|
139
|
+
|
|
60
140
|
function config(args) {
|
|
61
141
|
var nOptions = Object.keys(args).length - 1;
|
|
142
|
+
var interactiveMode = args['_'].length === 1 && (nOptions < 1 || nOptions === 1 && args.reset);
|
|
143
|
+
var hasAddServerCommand = args['_'].length === 2 && args['_'][1] === 'add' && args.server && args.key && args.k && args.alias && (nOptions === 4 || nOptions === 5 && args["default"]);
|
|
144
|
+
if (!interactiveMode && !hasAddServerCommand) return false;
|
|
62
145
|
|
|
63
|
-
if (
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (!_fs["default"].existsSync(confPath) || args.reset) {
|
|
69
|
-
_fs["default"].writeFileSync(confPath, _jsYaml["default"].dump(confTemplate));
|
|
70
|
-
}
|
|
146
|
+
if (!_fs["default"].existsSync(grokDir)) {
|
|
147
|
+
_fs["default"].mkdirSync(grokDir);
|
|
148
|
+
}
|
|
71
149
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
150
|
+
if (!_fs["default"].existsSync(confPath) || args.reset) {
|
|
151
|
+
_fs["default"].writeFileSync(confPath, _jsYaml["default"].dump(confTemplate));
|
|
152
|
+
}
|
|
75
153
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
154
|
+
var config = _jsYaml["default"].load(_fs["default"].readFileSync(confPath, {
|
|
155
|
+
encoding: 'utf-8'
|
|
156
|
+
}));
|
|
79
157
|
|
|
80
|
-
|
|
81
|
-
|
|
158
|
+
if (hasAddServerCommand) {
|
|
159
|
+
try {
|
|
160
|
+
new URL(args.server);
|
|
161
|
+
} catch (error) {
|
|
162
|
+
console.error('URL parsing error. Please, provide a valid server URL.');
|
|
82
163
|
return false;
|
|
83
164
|
}
|
|
84
165
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
_context.next = 22;
|
|
106
|
-
break;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
_context.t0 = _regenerator["default"].keys(_config.servers);
|
|
110
|
-
|
|
111
|
-
case 6:
|
|
112
|
-
if ((_context.t1 = _context.t0()).done) {
|
|
113
|
-
_context.next = 17;
|
|
114
|
-
break;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
server = _context.t1.value;
|
|
118
|
-
url = _config['servers'][server]['url'];
|
|
119
|
-
question = generateKeyQ(server, url);
|
|
120
|
-
question["default"] = _config['servers'][server]['key'];
|
|
121
|
-
_context.next = 13;
|
|
122
|
-
return _inquirer["default"].prompt(question);
|
|
123
|
-
|
|
124
|
-
case 13:
|
|
125
|
-
devKey = _context.sent;
|
|
126
|
-
_config['servers'][server]['key'] = devKey[server];
|
|
127
|
-
_context.next = 6;
|
|
128
|
-
break;
|
|
166
|
+
config.servers[args.alias] = {
|
|
167
|
+
url: args.server,
|
|
168
|
+
key: args.key
|
|
169
|
+
};
|
|
170
|
+
console.log('Successfully added the server.');
|
|
171
|
+
console.log("Use this command to deploy packages: grok publish ".concat(args.alias));
|
|
172
|
+
|
|
173
|
+
if (args["default"]) {
|
|
174
|
+
config["default"] = args.alias;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
console.log("Your config file (".concat(confPath, "):"));
|
|
179
|
+
console.log(config);
|
|
180
|
+
var valRes = (0, _configValidator.validateConf)(config);
|
|
181
|
+
|
|
182
|
+
if (!config || !valRes.value) {
|
|
183
|
+
console.log(valRes.message);
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
129
186
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
case 22:
|
|
153
|
-
_context.next = 29;
|
|
187
|
+
if (valRes.warnings.length) console.log(valRes.warnings.join('\n'));
|
|
188
|
+
(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
189
|
+
var answers, server, url, question, devKey, defaultServer;
|
|
190
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
191
|
+
while (1) {
|
|
192
|
+
switch (_context.prev = _context.next) {
|
|
193
|
+
case 0:
|
|
194
|
+
_context.prev = 0;
|
|
195
|
+
_context.next = 3;
|
|
196
|
+
return _inquirer["default"].prompt({
|
|
197
|
+
name: 'edit-config',
|
|
198
|
+
type: 'confirm',
|
|
199
|
+
message: 'Do you want to edit it?',
|
|
200
|
+
"default": false
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
case 3:
|
|
204
|
+
answers = _context.sent;
|
|
205
|
+
|
|
206
|
+
if (!answers['edit-config']) {
|
|
207
|
+
_context.next = 23;
|
|
154
208
|
break;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
_context.t0 = _regenerator["default"].keys(config.servers);
|
|
155
212
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
_context.
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
213
|
+
case 6:
|
|
214
|
+
if ((_context.t1 = _context.t0()).done) {
|
|
215
|
+
_context.next = 17;
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
server = _context.t1.value;
|
|
220
|
+
url = config['servers'][server]['url'];
|
|
221
|
+
question = generateKeyQ(server, url);
|
|
222
|
+
question["default"] = config['servers'][server]['key'];
|
|
223
|
+
_context.next = 13;
|
|
224
|
+
return _inquirer["default"].prompt(question);
|
|
225
|
+
|
|
226
|
+
case 13:
|
|
227
|
+
devKey = _context.sent;
|
|
228
|
+
config['servers'][server]['key'] = devKey[server];
|
|
229
|
+
_context.next = 6;
|
|
230
|
+
break;
|
|
231
|
+
|
|
232
|
+
case 17:
|
|
233
|
+
_context.next = 19;
|
|
234
|
+
return addNewServer(config);
|
|
235
|
+
|
|
236
|
+
case 19:
|
|
237
|
+
_context.next = 21;
|
|
238
|
+
return _inquirer["default"].prompt({
|
|
239
|
+
name: 'default-server',
|
|
240
|
+
type: 'input',
|
|
241
|
+
message: 'Your default server:',
|
|
242
|
+
validate: function validate(server) {
|
|
243
|
+
if (server in config.servers) {
|
|
244
|
+
return true;
|
|
245
|
+
} else {
|
|
246
|
+
return 'Only one of the specified servers may be chosen as default';
|
|
247
|
+
}
|
|
248
|
+
},
|
|
249
|
+
"default": config["default"]
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
case 21:
|
|
253
|
+
defaultServer = _context.sent;
|
|
254
|
+
config["default"] = defaultServer['default-server']; // fs.writeFileSync(confPath, yaml.dump(config));
|
|
255
|
+
|
|
256
|
+
case 23:
|
|
257
|
+
_context.next = 30;
|
|
258
|
+
break;
|
|
259
|
+
|
|
260
|
+
case 25:
|
|
261
|
+
_context.prev = 25;
|
|
262
|
+
_context.t2 = _context["catch"](0);
|
|
263
|
+
console.error('The file is corrupted. Please run `grok config --reset` to restore the default template');
|
|
264
|
+
console.error(_context.t2);
|
|
265
|
+
return _context.abrupt("return", false);
|
|
266
|
+
|
|
267
|
+
case 30:
|
|
268
|
+
case "end":
|
|
269
|
+
return _context.stop();
|
|
167
270
|
}
|
|
168
|
-
}
|
|
169
|
-
})
|
|
170
|
-
|
|
171
|
-
|
|
271
|
+
}
|
|
272
|
+
}, _callee, null, [[0, 25]]);
|
|
273
|
+
}))();
|
|
274
|
+
|
|
275
|
+
_fs["default"].writeFileSync(confPath, _jsYaml["default"].dump(config));
|
|
276
|
+
|
|
277
|
+
return true;
|
|
172
278
|
}
|
package/bin/commands/help.js
CHANGED
|
@@ -7,7 +7,7 @@ exports.help = void 0;
|
|
|
7
7
|
var HELP = "\nUsage: grok <command>\n\nDatagrok's package management tool\n\nCommands:\n add Add an object template\n api Create wrapper functions\n config Create and manage config files\n create Create a package\n publish Upload a package\n migrate Switch to `grok` tools\n\nTo get help on a particular command, use:\n grok <command> --help\n\nRead more about the package development workflow:\nhttps://datagrok.ai/help/develop/develop\n";
|
|
8
8
|
var HELP_ADD = "\nUsage: grok add <entity> <name>\n\nAdd an object template to your package:\n\ngrok add app <name>\ngrok add connection <name>\ngrok add detector <semantic-type-name>\ngrok add function [tag] <name>\ngrok add query <name>\ngrok add script [tag] <language> <name>\ngrok add view <name>\ngrok add viewer <name>\n\nPlease note that entity names may only include letters and numbers\n\nSupported languages for scripts:\njavascript, julia, node, octave, python, r\n\nAvailable tags:\npanel, init\n";
|
|
9
9
|
var HELP_API = "\nUsage: grok api\n\nCreate wrapper functions for package scripts and queries\n";
|
|
10
|
-
var HELP_CONFIG = "\nUsage: grok config\n\nCreate or update a configuration file\n\nOptions:\n[--reset]\n\n--reset Restore the default config file template\n";
|
|
10
|
+
var HELP_CONFIG = "\nUsage: grok config\n\nCreate or update a configuration file\n\nOptions:\n[--reset] [--server] [--alias] [--key]\n\n--reset Restore the default config file template\n--server Use to add a server to the config (`grok config add --alias alias --server url --key key`)\n--alias Use in conjunction with the `server` option to set the server name\n--key Use in conjunction with the `server` option to set the developer key\n--default Use in conjunction with the `server` option to set the added server as default\n";
|
|
11
11
|
var HELP_CREATE = "\nUsage: grok create [name]\n\nCreate a package:\n\ngrok create Create a package in the current working directory\ngrok create <name> Create a package in a folder with the specified name\n\nPlease note that the package name may only include letters, numbers, underscores, or hyphens\n\nOptions:\n[--eslint] [--ide] [--ts]\n\n--eslint Add a configuration for eslint\n--ide Add an IDE-specific configuration for debugging (vscode)\n--ts Create a TypeScript package\n";
|
|
12
12
|
var HELP_PUBLISH = "\nUsage: grok publish [host]\n\nUpload a package\n\nOptions:\n[--build|--rebuild] [--debug|--release] [--key] [--suffix]\n\nRunning `grok publish` is the same as running `grok publish defaultHost --build --debug`\n";
|
|
13
13
|
var HELP_MIGRATE = "\nUsage: grok migrate\n\nSwitch to `grok` tools by copying your keys to the config\nfile and converting your scripts in the `package.json` file\n";
|
package/bin/utils/ent-helpers.js
CHANGED
|
@@ -27,7 +27,7 @@ var query = function query(queryName) {
|
|
|
27
27
|
};
|
|
28
28
|
|
|
29
29
|
var script = function script(scriptName, packageName) {
|
|
30
|
-
return "\nThe script ".concat(scriptName, " has been created. To call it from a JavaScript file, use:\n\n await grok.functions.call('").concat(packageName, ":").concat(scriptName, "', { params });\n \nRead more at https://datagrok.ai/help/
|
|
30
|
+
return "\nThe script ".concat(scriptName, " has been created. To call it from a JavaScript file, use:\n\n await grok.functions.call('").concat(packageName, ":").concat(scriptName, "', { params });\n \nRead more at https://datagrok.ai/help/compute/scripting\nSee examples at https://public.datagrok.ai/scripts,\nhttps://public.datagrok.ai/js/samples/scripting/scripting");
|
|
31
31
|
};
|
|
32
32
|
|
|
33
33
|
var view = function view(viewName) {
|
package/bin/utils/utils.js
CHANGED
|
@@ -18,7 +18,7 @@ exports.isEmpty = isEmpty;
|
|
|
18
18
|
exports.isPackageDir = isPackageDir;
|
|
19
19
|
exports.kebabToCamelCase = kebabToCamelCase;
|
|
20
20
|
exports.mapURL = mapURL;
|
|
21
|
-
exports.queryWrapperTemplate = exports.queryExtension = void 0;
|
|
21
|
+
exports.queryWrapperTemplate = exports.queryExtension = exports.namespaceTemplate = void 0;
|
|
22
22
|
exports.removeScope = removeScope;
|
|
23
23
|
exports.scriptWrapperTemplate = exports.scriptLangExtMap = exports.scriptExtensions = exports.replacers = void 0;
|
|
24
24
|
exports.spaceToCamelCase = spaceToCamelCase;
|
|
@@ -99,15 +99,21 @@ function friendlyNameToName(s) {
|
|
|
99
99
|
var firstUpper = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
100
100
|
var out = '';
|
|
101
101
|
var cap = true;
|
|
102
|
+
var firstWordUpperCase = false;
|
|
102
103
|
var start = true;
|
|
103
104
|
s = ((_s = s) !== null && _s !== void 0 ? _s : '').trim();
|
|
104
105
|
var letterRegex = /[A-Za-z]/;
|
|
105
106
|
var digitRegex = /\d/;
|
|
106
107
|
|
|
108
|
+
var isUpper = function isUpper(s) {
|
|
109
|
+
return /[A-Z]/.test(s);
|
|
110
|
+
};
|
|
111
|
+
|
|
107
112
|
for (var i = 0; i < s.length; i++) {
|
|
108
113
|
if (!letterRegex.test(s[i]) && !digitRegex.test(s[i])) cap = true;else {
|
|
109
114
|
if (start && digitRegex.test(s[i])) continue;
|
|
110
|
-
|
|
115
|
+
firstWordUpperCase = start ? isUpper(s[i]) : firstWordUpperCase && isUpper(s[i]);
|
|
116
|
+
out += !firstUpper && (start || firstWordUpperCase && !cap) ? s[i].toLowerCase() : cap ? s[i].toUpperCase() : s[i];
|
|
111
117
|
cap = false;
|
|
112
118
|
start = false;
|
|
113
119
|
}
|
|
@@ -136,16 +142,10 @@ var replacers = {
|
|
|
136
142
|
return s.replace(/#{PACKAGE_NAMESPACE}/g, kebabToCamelCase(removeScope(name)));
|
|
137
143
|
},
|
|
138
144
|
FUNC_NAME: function FUNC_NAME(s, name) {
|
|
139
|
-
return s.replace(/#{FUNC_NAME}/g,
|
|
145
|
+
return s.replace(/#{FUNC_NAME}/g, friendlyNameToName(name));
|
|
140
146
|
},
|
|
141
147
|
FUNC_NAME_LOWERCASE: function FUNC_NAME_LOWERCASE(s, name) {
|
|
142
|
-
return s.replace(/#{FUNC_NAME_LOWERCASE}/g,
|
|
143
|
-
},
|
|
144
|
-
QUERY_NAME: function QUERY_NAME(s, name) {
|
|
145
|
-
return s.replace(/#{QUERY_NAME}/g, friendlyNameToName(name));
|
|
146
|
-
},
|
|
147
|
-
QUERY_NAME_LOWERCASE: function QUERY_NAME_LOWERCASE(s, name) {
|
|
148
|
-
return s.replace(/#{QUERY_NAME_LOWERCASE}/g, friendlyNameToName(name, false));
|
|
148
|
+
return s.replace(/#{FUNC_NAME_LOWERCASE}/g, friendlyNameToName(name, false));
|
|
149
149
|
},
|
|
150
150
|
PARAMS_OBJECT: function PARAMS_OBJECT(s, params) {
|
|
151
151
|
return s.replace(/#{PARAMS_OBJECT}/g, params.length ? "{ ".concat(params.map(function (p) {
|
|
@@ -179,6 +179,14 @@ var TemplateBuilder = /*#__PURE__*/function () {
|
|
|
179
179
|
}, {
|
|
180
180
|
key: "build",
|
|
181
181
|
value: function build() {
|
|
182
|
+
var indent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
|
|
183
|
+
|
|
184
|
+
if (indent) {
|
|
185
|
+
this.template = this.template.split(TemplateBuilder.sep).map(function (line) {
|
|
186
|
+
return ' '.repeat(indent * TemplateBuilder.indentSize) + line;
|
|
187
|
+
}).join(TemplateBuilder.sep);
|
|
188
|
+
}
|
|
189
|
+
|
|
182
190
|
return this.template;
|
|
183
191
|
}
|
|
184
192
|
}]);
|
|
@@ -186,6 +194,8 @@ var TemplateBuilder = /*#__PURE__*/function () {
|
|
|
186
194
|
}();
|
|
187
195
|
|
|
188
196
|
exports.TemplateBuilder = TemplateBuilder;
|
|
197
|
+
(0, _defineProperty2["default"])(TemplateBuilder, "sep", '\n');
|
|
198
|
+
(0, _defineProperty2["default"])(TemplateBuilder, "indentSize", 2);
|
|
189
199
|
var scriptLangExtMap = {
|
|
190
200
|
javascript: 'js',
|
|
191
201
|
julia: 'jl',
|
|
@@ -303,5 +313,7 @@ var dgImports = "import * as grok from 'datagrok-api/grok';\nimport * as DG from
|
|
|
303
313
|
exports.dgImports = dgImports;
|
|
304
314
|
var scriptWrapperTemplate = "export async function #{FUNC_NAME_LOWERCASE}(#{TYPED_PARAMS}): Promise<#{OUTPUT_TYPE}> {\n return await grok.functions.call('#{PACKAGE_NAMESPACE}:#{FUNC_NAME}', #{PARAMS_OBJECT});\n}";
|
|
305
315
|
exports.scriptWrapperTemplate = scriptWrapperTemplate;
|
|
306
|
-
var queryWrapperTemplate = "export async function #{
|
|
307
|
-
exports.queryWrapperTemplate = queryWrapperTemplate;
|
|
316
|
+
var queryWrapperTemplate = "export async function #{FUNC_NAME_LOWERCASE}(#{TYPED_PARAMS}): Promise<#{OUTPUT_TYPE}> {\n return await grok.data.query('#{PACKAGE_NAMESPACE}:#{FUNC_NAME}', #{PARAMS_OBJECT});\n}";
|
|
317
|
+
exports.queryWrapperTemplate = queryWrapperTemplate;
|
|
318
|
+
var namespaceTemplate = "export namespace #{PACKAGE_NAMESPACE} {\n#{NAME}\n}";
|
|
319
|
+
exports.namespaceTemplate = namespaceTemplate;
|
|
@@ -21,6 +21,15 @@
|
|
|
21
21
|
],
|
|
22
22
|
"require-jsdoc": "off",
|
|
23
23
|
"spaced-comment": "off",
|
|
24
|
-
"linebreak-style": "off"
|
|
24
|
+
"linebreak-style": "off",
|
|
25
|
+
"curly": [
|
|
26
|
+
"error",
|
|
27
|
+
"multi-or-nest"
|
|
28
|
+
],
|
|
29
|
+
"brace-style": [
|
|
30
|
+
"error",
|
|
31
|
+
"1tbs",
|
|
32
|
+
{ "allowSingleLine": true }
|
|
33
|
+
]
|
|
25
34
|
}
|
|
26
35
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "datagrok-tools",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.20",
|
|
4
4
|
"description": "Utility to upload and publish packages to Datagrok",
|
|
5
5
|
"homepage": "https://github.com/datagrok-ai/public/tree/master/tools#readme",
|
|
6
6
|
"dependencies": {
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"path": "^0.12.7"
|
|
19
19
|
},
|
|
20
20
|
"scripts": {
|
|
21
|
+
"link": "npm link",
|
|
21
22
|
"prepublishOnly": "babel bin --extensions .ts -d bin",
|
|
22
23
|
"babel": "babel bin --extensions .ts -d bin"
|
|
23
24
|
},
|
package/src/test-utils.ts
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import * as path from "path";
|
|
2
|
-
import * as os from "os";
|
|
3
|
-
import * as fs from "fs";
|
|
4
|
-
import * as yaml from 'js-yaml';
|
|
5
|
-
import { Config, Indexable } from "../bin/utils/utils";
|
|
6
|
-
const fetch = require('node-fetch');
|
|
7
|
-
|
|
8
|
-
export async function getToken(url: string, key: string) {
|
|
9
|
-
let response = await fetch(`${url}/users/login/dev/${key}`, {method: 'POST'});
|
|
10
|
-
let json = await response.json();
|
|
11
|
-
if (json.isSuccess == true)
|
|
12
|
-
return json.token;
|
|
13
|
-
else
|
|
14
|
-
throw 'Unable to login to server. Check your dev key';
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export async function getWebUrl(url: string, token: string) {
|
|
18
|
-
let response = await fetch(`${url}/admin/plugins/admin/settings`, {headers: {Authorization: token}});
|
|
19
|
-
let json = await response.json();
|
|
20
|
-
return json.settings.webRoot;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const grokDir = path.join(os.homedir(), '.grok');
|
|
24
|
-
const confPath = path.join(grokDir, 'config.yaml');
|
|
25
|
-
|
|
26
|
-
function mapURL(conf: Config): Indexable {
|
|
27
|
-
let urls: Indexable = {};
|
|
28
|
-
for (let server in conf.servers) {
|
|
29
|
-
urls[conf['servers'][server]['url']] = conf['servers'][server];
|
|
30
|
-
}
|
|
31
|
-
return urls;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function getDevKey(hostKey: string): {url: string, key: string} {
|
|
35
|
-
let config = yaml.load(fs.readFileSync(confPath, 'utf8')) as any;
|
|
36
|
-
let host = hostKey == '' ? config.default : hostKey;
|
|
37
|
-
host = host.trim();
|
|
38
|
-
let urls = mapURL(config);
|
|
39
|
-
let key = '';
|
|
40
|
-
let url = '';
|
|
41
|
-
try {
|
|
42
|
-
let url = new URL(host).href;
|
|
43
|
-
if (url.endsWith('/')) url = url.slice(0, -1);
|
|
44
|
-
if (url in urls) key = config['servers'][urls[url]]['key'];
|
|
45
|
-
} catch (error) {
|
|
46
|
-
if (config['servers'][host] == null)
|
|
47
|
-
throw `Unknown server alias. Please add it to ${confPath}`;
|
|
48
|
-
url = config['servers'][host]['url'];
|
|
49
|
-
key = config['servers'][host]['key'];
|
|
50
|
-
}
|
|
51
|
-
return {url, key};
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export async function getBrowserPage(puppeteer: any): Promise<{browser: any, page: any}> {
|
|
55
|
-
let url:string = process.env.HOST ?? '';
|
|
56
|
-
let cfg = getDevKey(url);
|
|
57
|
-
url = cfg.url;
|
|
58
|
-
|
|
59
|
-
let key = cfg.key;
|
|
60
|
-
let token = await getToken(url, key);
|
|
61
|
-
url = await getWebUrl(url, token);
|
|
62
|
-
console.log(`Using web root: ${url}`);
|
|
63
|
-
|
|
64
|
-
let browser = await puppeteer.launch({
|
|
65
|
-
args: ['--disable-dev-shm-usage', '--disable-features=site-per-process'],
|
|
66
|
-
ignoreHTTPSErrors: true,
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
let page = await browser.newPage();
|
|
70
|
-
await page.goto(`${url}/oauth/`);
|
|
71
|
-
await page.setCookie({name: 'auth', value: token});
|
|
72
|
-
await page.evaluate((token: any) => {
|
|
73
|
-
window.localStorage.setItem('auth', token);
|
|
74
|
-
}, token);
|
|
75
|
-
await page.goto(url);
|
|
76
|
-
try {
|
|
77
|
-
await page.waitForSelector('.grok-preloader');
|
|
78
|
-
console.log('got preloader');
|
|
79
|
-
await page.waitForFunction(() => document.querySelector('.grok-preloader') == null, {timeout: 100000});
|
|
80
|
-
} catch (error) {
|
|
81
|
-
throw error;
|
|
82
|
-
}
|
|
83
|
-
return {browser, page};
|
|
84
|
-
}
|