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.
@@ -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 './#{NAME_LOWERCASE}';\n");
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 './#{NAME_LOWERCASE}';\n");
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
 
@@ -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('QUERY_NAME', name).replace('QUERY_NAME_LOWERCASE', name).replace('PACKAGE_NAMESPACE', _package.name);
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 queryFilePath = _path["default"].join(_fs["default"].existsSync(srcDir) ? srcDir : curDir, 'queries-api.ts');
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 funcFilePath = _path["default"].join(_fs["default"].existsSync(srcDir) ? srcDir : curDir, 'scripts-api.ts');
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
- _fs["default"].writeFileSync(funcFilePath, utils.dgImports + sep + wrappers.join(sep.repeat(2)) + sep, 'utf8');
190
+ console.log("Successfully generated file ".concat(funcFileName).concat(sep));
182
191
  }
183
192
 
184
193
  function api(args) {
@@ -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 (args['_'].length === 1 && (nOptions < 1 || nOptions === 1 && args.reset)) {
64
- if (!_fs["default"].existsSync(grokDir)) {
65
- _fs["default"].mkdirSync(grokDir);
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
- var _config = _jsYaml["default"].load(_fs["default"].readFileSync(confPath, {
73
- encoding: 'utf-8'
74
- }));
150
+ if (!_fs["default"].existsSync(confPath) || args.reset) {
151
+ _fs["default"].writeFileSync(confPath, _jsYaml["default"].dump(confTemplate));
152
+ }
75
153
 
76
- console.log("Your config file (".concat(confPath, "):"));
77
- console.log(_config);
78
- var valRes = (0, _configValidator.validateConf)(_config);
154
+ var config = _jsYaml["default"].load(_fs["default"].readFileSync(confPath, {
155
+ encoding: 'utf-8'
156
+ }));
79
157
 
80
- if (!_config || !valRes.value) {
81
- console.log(valRes.message);
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
- if (valRes.warnings.length) console.log(valRes.warnings.join('\n'));
86
- (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
87
- var answers, server, url, question, devKey, defaultServer;
88
- return _regenerator["default"].wrap(function _callee$(_context) {
89
- while (1) {
90
- switch (_context.prev = _context.next) {
91
- case 0:
92
- _context.prev = 0;
93
- _context.next = 3;
94
- return _inquirer["default"].prompt({
95
- name: 'edit-config',
96
- type: 'confirm',
97
- message: 'Do you want to edit it?',
98
- "default": false
99
- });
100
-
101
- case 3:
102
- answers = _context.sent;
103
-
104
- if (!answers['edit-config']) {
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
- case 17:
131
- _context.next = 19;
132
- return _inquirer["default"].prompt({
133
- name: 'default-server',
134
- type: 'input',
135
- message: 'Your default server:',
136
- validate: function validate(server) {
137
- if (server in _config.servers) {
138
- return true;
139
- } else {
140
- return 'Only one of the specified servers may be chosen as default';
141
- }
142
- },
143
- "default": _config["default"]
144
- });
145
-
146
- case 19:
147
- defaultServer = _context.sent;
148
- _config["default"] = defaultServer['default-server'];
149
-
150
- _fs["default"].writeFileSync(confPath, _jsYaml["default"].dump(_config));
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
- case 24:
157
- _context.prev = 24;
158
- _context.t2 = _context["catch"](0);
159
- console.error('The file is corrupted. Please run `grok config --reset` to restore the default template');
160
- console.error(_context.t2);
161
- return _context.abrupt("return", false);
162
-
163
- case 29:
164
- case "end":
165
- return _context.stop();
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
- }, _callee, null, [[0, 24]]);
169
- }))();
170
- return true;
171
- }
271
+ }
272
+ }, _callee, null, [[0, 25]]);
273
+ }))();
274
+
275
+ _fs["default"].writeFileSync(confPath, _jsYaml["default"].dump(config));
276
+
277
+ return true;
172
278
  }
@@ -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";
@@ -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/develop/scripting\nSee examples at https://public.datagrok.ai/scripts,\nhttps://public.datagrok.ai/js/samples/scripting/scripting");
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) {
@@ -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
- out += start && !firstUpper ? s[i].toLowerCase() : cap ? s[i].toUpperCase() : s[i];
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, name.includes('-') ? kebabToCamelCase(name) : name.includes(' ') ? spaceToCamelCase(name) : name[0].toUpperCase() + name.slice(1));
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, name.includes('-') ? kebabToCamelCase(name, false) : name.includes(' ') ? spaceToCamelCase(name, false) : wordsToCamelCase(name, false));
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 #{QUERY_NAME_LOWERCASE}(#{TYPED_PARAMS}): Promise<#{OUTPUT_TYPE}> {\n return await grok.data.query('#{PACKAGE_NAMESPACE}:#{QUERY_NAME}', #{PARAMS_OBJECT});\n}";
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;
@@ -22,7 +22,7 @@ export class #{NAME} extends DG.ViewBase {
22
22
  }
23
23
 
24
24
  get helpUrl() {
25
- return '/help/develop/jupyter-notebook.md';
25
+ return '/help/compute/jupyter-notebook.md';
26
26
  }
27
27
 
28
28
  get name() {
@@ -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.16",
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
- }