datagrok-tools 4.1.13 → 4.1.17

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 CHANGED
@@ -67,7 +67,7 @@ Read more about package development in [Datagrok's documentation](https://datagr
67
67
  we recommend that you postfix them with 'View' and 'Viewer' respectively.
68
68
  Supported languages for scripts are `javascript`, `julia`, `node`, `octave`, `python`, `r`.
69
69
  Available function tags: `panel`, `init`.
70
- - `api` creates wrapper functions for package scripts. The output is stored in `/src/scripts-api.ts`.
70
+ - `api` creates wrapper functions for package scripts and queries. The output is stored in files `/src/scripts-api.ts` and `/src/queries-api.ts` respectively.
71
71
  - `publish` uploads a package to the specified server (pass either a URL or a server alias from the `config.yaml` file).
72
72
  ```
73
73
  cd <package-name>
@@ -14,7 +14,7 @@ const packDir = path.join(curDir, 'package.json');
14
14
  const grokDir = path.join(os.homedir(), '.grok');
15
15
  const confPath = path.join(grokDir, 'config.yaml');
16
16
  const confTemplateDir = path.join(path.dirname(path.dirname(__dirname)), 'config-template.yaml');
17
- const confTemplate = yaml.safeLoad(fs.readFileSync(confTemplateDir));
17
+ const confTemplate = yaml.load(fs.readFileSync(confTemplateDir));
18
18
 
19
19
  const grokMap = {
20
20
  'datagrok-upload': 'grok publish',
@@ -34,9 +34,9 @@ function migrate(args) {
34
34
 
35
35
  // Create `config.yaml` if it doesn't exist yet
36
36
  if (!fs.existsSync(grokDir)) fs.mkdirSync(grokDir);
37
- if (!fs.existsSync(confPath)) fs.writeFileSync(confPath, yaml.safeDump(confTemplate));
37
+ if (!fs.existsSync(confPath)) fs.writeFileSync(confPath, yaml.dump(confTemplate));
38
38
 
39
- let config = yaml.safeLoad(fs.readFileSync(confPath));
39
+ let config = yaml.load(fs.readFileSync(confPath));
40
40
 
41
41
  // Copy keys to the `config.yaml` file
42
42
  if (fs.existsSync(keysDir)) {
@@ -54,7 +54,7 @@ function migrate(args) {
54
54
  console.log(`Skipping an invalid URL in \`upload.keys.json\`: ${url}`);
55
55
  }
56
56
  }
57
- fs.writeFileSync(confPath, yaml.safeDump(config));
57
+ fs.writeFileSync(confPath, yaml.dump(config));
58
58
  console.log(`Migrated data from local \`upload.keys.json\` to ${confPath}`);
59
59
  fs.unlinkSync(keysDir);
60
60
  console.log('Successfully deleted the file');
@@ -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
 
@@ -37,6 +37,12 @@ function generateQueryWrappers() {
37
37
  return;
38
38
  }
39
39
 
40
+ var packagePath = _path["default"].join(curDir, 'package.json');
41
+
42
+ var _package = JSON.parse(_fs["default"].readFileSync(packagePath, {
43
+ encoding: 'utf-8'
44
+ }));
45
+
40
46
  var files = _ignoreWalk["default"].sync({
41
47
  path: './queries',
42
48
  ignoreFiles: ['.npmignore', '.gitignore']
@@ -71,36 +77,7 @@ function generateQueryWrappers() {
71
77
  var q = _step2.value;
72
78
  var name = utils.getScriptName(q, utils.commentMap[utils.queryExtension]);
73
79
  if (!name) continue;
74
- var tb = new utils.TemplateBuilder(utils.queryWrapperTemplate).replace('FUNC_NAME', name).replace('FUNC_NAME_LOWERCASE', name);
75
- var connection = utils.getParam('connection', q, utils.commentMap[utils.queryExtension]);
76
-
77
- if (!connection) {
78
- // Use the name of the first found connection (either a field or file name)
79
- var connectionsDir = _path["default"].join(curDir, 'connections');
80
-
81
- if (_fs["default"].existsSync(connectionsDir) && _fs["default"].readdirSync(connectionsDir).length !== 0) {
82
- var connectionFile = _fs["default"].readdirSync(connectionsDir).find(function (c) {
83
- return /.+\.json$/.test(c);
84
- });
85
-
86
- if (!connectionFile) {
87
- console.log("Connection for query \"".concat(name, "\" not found."));
88
- continue;
89
- }
90
-
91
- try {
92
- var paramString = _fs["default"].readFileSync(connectionFile, 'utf8');
93
-
94
- var params = JSON.parse(paramString);
95
- connection = params.name || connectionFile.slice(0, -5);
96
- } catch (error) {
97
- console.log("Connection for query \"".concat(name, "\" not found."));
98
- continue;
99
- }
100
- }
101
- }
102
-
103
- tb.replace('NAME', connection);
80
+ var tb = new utils.TemplateBuilder(utils.queryWrapperTemplate).replace('FUNC_NAME', name).replace('FUNC_NAME_LOWERCASE', name).replace('PACKAGE_NAMESPACE', _package.name);
104
81
  var inputs = utils.getScriptInputs(q, utils.commentMap[utils.queryExtension]);
105
82
  var outputType = utils.getScriptOutputType(q, utils.commentMap[utils.queryExtension]);
106
83
  tb.replace('PARAMS_OBJECT', inputs).replace('TYPED_PARAMS', inputs) // The query output, if omitted, is a dataframe
@@ -142,6 +119,12 @@ function generateScriptWrappers() {
142
119
  return;
143
120
  }
144
121
 
122
+ var packagePath = _path["default"].join(curDir, 'package.json');
123
+
124
+ var _package = JSON.parse(_fs["default"].readFileSync(packagePath, {
125
+ encoding: 'utf-8'
126
+ }));
127
+
145
128
  var files = _ignoreWalk["default"].sync({
146
129
  path: './scripts',
147
130
  ignoreFiles: ['.npmignore', '.gitignore']
@@ -167,15 +150,7 @@ function generateScriptWrappers() {
167
150
  if (!script) return "continue";
168
151
  var name = utils.getScriptName(script, utils.commentMap[extension]);
169
152
  if (!name) return "continue";
170
- var tb = new utils.TemplateBuilder(utils.scriptWrapperTemplate).replace('FUNC_NAME', name).replace('FUNC_NAME_LOWERCASE', name);
171
-
172
- var packagePath = _path["default"].join(curDir, 'package.json');
173
-
174
- var _package = JSON.parse(_fs["default"].readFileSync(packagePath, {
175
- encoding: 'utf-8'
176
- }));
177
-
178
- tb.replace('PACKAGE_NAMESPACE', _package.name);
153
+ var tb = new utils.TemplateBuilder(utils.scriptWrapperTemplate).replace('FUNC_NAME', name).replace('FUNC_NAME_LOWERCASE', name).replace('PACKAGE_NAMESPACE', _package.name);
179
154
  var inputs = utils.getScriptInputs(script);
180
155
  var outputType = utils.getScriptOutputType(script);
181
156
  tb.replace('PARAMS_OBJECT', inputs).replace('TYPED_PARAMS', inputs).replace('OUTPUT_TYPE', outputType);
@@ -13,8 +13,6 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
13
13
 
14
14
  var _fs = _interopRequireDefault(require("fs"));
15
15
 
16
- var _inquirer = _interopRequireDefault(require("inquirer"));
17
-
18
16
  var _path = _interopRequireDefault(require("path"));
19
17
 
20
18
  var _os = _interopRequireDefault(require("os"));
@@ -93,7 +91,7 @@ function createDirectoryContents(name, config, templateDir, packageDir) {
93
91
  _package['scripts']["release-".concat(name.toLowerCase(), "-").concat(server)] = "grok publish ".concat(server, " --rebuild --release");
94
92
  }
95
93
 
96
- if (ts) Object.assign(_package.dependencies, {
94
+ if (ts) Object.assign(_package.devDependencies, {
97
95
  'ts-loader': 'latest',
98
96
  'typescript': 'latest'
99
97
  });
@@ -201,22 +199,11 @@ function create(args) {
201
199
  createDirectoryContents(name, config, templateDir, packageDir, args.ide, args.ts, args.eslint);
202
200
  console.log(_entHelpers.help["package"](name, args.ts));
203
201
  console.log("\nThe package has the following dependencies:\n".concat(dependencies.join(' '), "\n"));
204
-
205
- _inquirer["default"].prompt({
206
- name: 'run-npm-install',
207
- type: 'confirm',
208
- message: 'Would you like to install them now with `npm`?',
209
- "default": false
210
- }).then(function (answers) {
211
- if (!answers['run-npm-install']) return;
212
- console.log('\nRunning `npm install` to get the required dependencies...\n');
213
- (0, _child_process.exec)('npm install', {
214
- cwd: packageDir
215
- }, function (err, stdout, stderr) {
216
- if (err) throw err;else console.log(stderr, stdout);
217
- });
218
- })["catch"](function (err) {
219
- return console.error(err);
202
+ console.log('Running `npm install` to get the required dependencies...\n');
203
+ (0, _child_process.exec)('npm install', {
204
+ cwd: packageDir
205
+ }, function (err, stdout, stderr) {
206
+ if (err) throw err;else console.log(stderr, stdout);
220
207
  });
221
208
  } else {
222
209
  console.log('Package name may only include letters, numbers, underscores, or hyphens');
@@ -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) {
@@ -9,6 +9,7 @@ exports.TemplateBuilder = void 0;
9
9
  exports.camelCaseToKebab = camelCaseToKebab;
10
10
  exports.checkScriptLocation = checkScriptLocation;
11
11
  exports.dgToTsTypeMap = exports.dgImports = exports.commentMap = void 0;
12
+ exports.friendlyNameToName = friendlyNameToName;
12
13
  exports.getParam = getParam;
13
14
  exports.getScriptInputs = getScriptInputs;
14
15
  exports.getScriptName = getScriptName;
@@ -17,7 +18,9 @@ exports.isEmpty = isEmpty;
17
18
  exports.isPackageDir = isPackageDir;
18
19
  exports.kebabToCamelCase = kebabToCamelCase;
19
20
  exports.mapURL = mapURL;
20
- exports.scriptWrapperTemplate = exports.scriptLangExtMap = exports.scriptExtensions = exports.replacers = exports.queryWrapperTemplate = exports.queryExtension = void 0;
21
+ exports.queryWrapperTemplate = exports.queryExtension = void 0;
22
+ exports.removeScope = removeScope;
23
+ exports.scriptWrapperTemplate = exports.scriptLangExtMap = exports.scriptExtensions = exports.replacers = void 0;
21
24
  exports.spaceToCamelCase = spaceToCamelCase;
22
25
  exports.wordsToCamelCase = wordsToCamelCase;
23
26
 
@@ -75,6 +78,11 @@ function camelCaseToKebab(s) {
75
78
  });
76
79
  }
77
80
 
81
+ function removeScope(name) {
82
+ var split = name.split('/');
83
+ return split[split.length - 1];
84
+ }
85
+
78
86
  function mapURL(conf) {
79
87
  var urls = {};
80
88
 
@@ -85,6 +93,35 @@ function mapURL(conf) {
85
93
  return urls;
86
94
  }
87
95
 
96
+ function friendlyNameToName(s) {
97
+ var _s;
98
+
99
+ var firstUpper = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
100
+ var out = '';
101
+ var cap = true;
102
+ var firstWordUpperCase = false;
103
+ var start = true;
104
+ s = ((_s = s) !== null && _s !== void 0 ? _s : '').trim();
105
+ var letterRegex = /[A-Za-z]/;
106
+ var digitRegex = /\d/;
107
+
108
+ var isUpper = function isUpper(s) {
109
+ return /[A-Z]/.test(s);
110
+ };
111
+
112
+ for (var i = 0; i < s.length; i++) {
113
+ if (!letterRegex.test(s[i]) && !digitRegex.test(s[i])) cap = true;else {
114
+ if (start && digitRegex.test(s[i])) continue;
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];
117
+ cap = false;
118
+ start = false;
119
+ }
120
+ }
121
+
122
+ return out;
123
+ }
124
+
88
125
  var replacers = {
89
126
  NAME: function NAME(s, name) {
90
127
  return s.replace(/#{NAME}/g, name);
@@ -102,13 +139,13 @@ var replacers = {
102
139
  return s.replace(/#{PACKAGE_DETECTORS_NAME}/g, kebabToCamelCase(name));
103
140
  },
104
141
  PACKAGE_NAMESPACE: function PACKAGE_NAMESPACE(s, name) {
105
- return s.replace(/#{PACKAGE_NAMESPACE}/g, kebabToCamelCase(name));
142
+ return s.replace(/#{PACKAGE_NAMESPACE}/g, kebabToCamelCase(removeScope(name)));
106
143
  },
107
144
  FUNC_NAME: function FUNC_NAME(s, name) {
108
- 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));
109
146
  },
110
147
  FUNC_NAME_LOWERCASE: function FUNC_NAME_LOWERCASE(s, name) {
111
- return s.replace(/#{FUNC_NAME_LOWERCASE}/g, name.includes('-') ? kebabToCamelCase(name, false) : name.includes(' ') ? spaceToCamelCase(name, false) : wordsToCamelCase(name, false));
148
+ return s.replace(/#{FUNC_NAME_LOWERCASE}/g, friendlyNameToName(name, false));
112
149
  },
113
150
  PARAMS_OBJECT: function PARAMS_OBJECT(s, params) {
114
151
  return s.replace(/#{PARAMS_OBJECT}/g, params.length ? "{ ".concat(params.map(function (p) {
@@ -266,5 +303,5 @@ var dgImports = "import * as grok from 'datagrok-api/grok';\nimport * as DG from
266
303
  exports.dgImports = dgImports;
267
304
  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}";
268
305
  exports.scriptWrapperTemplate = scriptWrapperTemplate;
269
- var queryWrapperTemplate = "export async function #{FUNC_NAME_LOWERCASE}(#{TYPED_PARAMS}): Promise<#{OUTPUT_TYPE}> {\n return await grok.data.query('#{NAME}:#{FUNC_NAME}', #{PARAMS_OBJECT});\n}";
306
+ 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}";
270
307
  exports.queryWrapperTemplate = queryWrapperTemplate;
@@ -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() {
@@ -1,25 +1,26 @@
1
- {
2
- "env": {
3
- "browser": true,
4
- "es2021": true
5
- },
6
- "extends": [
7
- "google"
8
- ],
9
- "parserOptions": {
10
- "ecmaVersion": 12,
11
- "sourceType": "module"
12
- },
13
- "rules": {
14
- "indent": [
15
- "error",
16
- 2
17
- ],
18
- "max-len": [
19
- "error",
20
- 120
21
- ],
22
- "require-jsdoc": "off",
23
- "spaced-comment": "off"
24
- }
1
+ {
2
+ "env": {
3
+ "browser": true,
4
+ "es2021": true
5
+ },
6
+ "extends": [
7
+ "google"
8
+ ],
9
+ "parserOptions": {
10
+ "ecmaVersion": 12,
11
+ "sourceType": "module"
12
+ },
13
+ "rules": {
14
+ "indent": [
15
+ "error",
16
+ 2
17
+ ],
18
+ "max-len": [
19
+ "error",
20
+ 120
21
+ ],
22
+ "require-jsdoc": "off",
23
+ "spaced-comment": "off",
24
+ "linebreak-style": "off"
25
+ }
25
26
  }
@@ -23,6 +23,7 @@ module.exports = {
23
23
  'rxjs/operators': 'rxjs.operators',
24
24
  'cash-dom': '$',
25
25
  'dayjs': 'dayjs',
26
+ 'wu': 'wu',
26
27
  },
27
28
  output: {
28
29
  filename: '[name].js',
@@ -15,6 +15,7 @@ module.exports = {
15
15
  'rxjs/operators': 'rxjs.operators',
16
16
  'cash-dom': '$',
17
17
  'dayjs': 'dayjs',
18
+ 'wu': 'wu',
18
19
  },
19
20
  output: {
20
21
  filename: '[name].js',
package/package.json CHANGED
@@ -1,22 +1,24 @@
1
1
  {
2
2
  "name": "datagrok-tools",
3
- "version": "4.1.13",
3
+ "version": "4.1.17",
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": {
7
- "inquirer": "^7.1.0",
8
- "minimist": "^1.2.5",
9
- "node-fetch": "^2.6.0",
10
- "fs": "latest",
11
- "node-recursive-directory": "^1.2.0",
12
- "path": "^0.12.7",
7
+ "@babel/runtime": "^7.16.0",
13
8
  "archiver": "^4.0.2",
14
9
  "archiver-promise": "^1.0.0",
10
+ "fs": "latest",
15
11
  "ignore-walk": "^3.0.3",
12
+ "inquirer": "^7.1.0",
16
13
  "js-yaml": "^4.1.0",
17
- "os": "^0.1.1"
14
+ "minimist": "^1.2.5",
15
+ "node-fetch": "^2.6.0",
16
+ "node-recursive-directory": "^1.2.0",
17
+ "os": "^0.1.1",
18
+ "path": "^0.12.7"
18
19
  },
19
20
  "scripts": {
21
+ "link": "npm link",
20
22
  "prepublishOnly": "babel bin --extensions .ts -d bin",
21
23
  "babel": "babel bin --extensions .ts -d bin"
22
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
- }