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.
@@ -1,46 +1,28 @@
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.config = config;
11
-
12
9
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
13
-
14
10
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
15
-
16
11
  var _fs = _interopRequireDefault(require("fs"));
17
-
18
12
  var _inquirer = _interopRequireDefault(require("inquirer"));
19
-
20
13
  var _os = _interopRequireDefault(require("os"));
21
-
22
14
  var _path = _interopRequireDefault(require("path"));
23
-
24
15
  var _jsYaml = _interopRequireDefault(require("js-yaml"));
25
-
26
16
  var _configValidator = require("../validators/config-validator");
27
-
28
17
  var color = _interopRequireWildcard(require("../utils/color-utils"));
29
-
30
18
  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); }
31
-
32
19
  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; }
33
-
34
20
  var confTemplateDir = _path["default"].join(_path["default"].dirname(_path["default"].dirname(__dirname)), 'config-template.yaml');
35
-
36
21
  var confTemplate = _jsYaml["default"].load(_fs["default"].readFileSync(confTemplateDir, {
37
22
  encoding: 'utf-8'
38
23
  }));
39
-
40
24
  var grokDir = _path["default"].join(_os["default"].homedir(), '.grok');
41
-
42
25
  var confPath = _path["default"].join(grokDir, 'config.yaml');
43
-
44
26
  function validateKey(key) {
45
27
  if (!key || /^([A-Za-z\d-])+$/.test(key)) {
46
28
  return true;
@@ -48,7 +30,6 @@ function validateKey(key) {
48
30
  return 'Developer key may only include letters, numbers, or hyphens';
49
31
  }
50
32
  }
51
-
52
33
  function generateKeyQ(server, url) {
53
34
  var origin = new URL(url).origin;
54
35
  var question = {
@@ -57,18 +38,14 @@ function generateKeyQ(server, url) {
57
38
  message: "Developer key (get it from ".concat(origin, "/u or press ENTER to skip):"),
58
39
  validate: validateKey
59
40
  };
60
-
61
41
  if (server.startsWith('local')) {
62
42
  question.message = "Developer key for ".concat(origin, " (press ENTER to skip):");
63
43
  }
64
-
65
44
  return question;
66
45
  }
67
-
68
46
  function addNewServer(_x) {
69
47
  return _addNewServer.apply(this, arguments);
70
48
  }
71
-
72
49
  function _addNewServer() {
73
50
  _addNewServer = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(config) {
74
51
  var addServer, name, url, key;
@@ -80,7 +57,6 @@ function _addNewServer() {
80
57
  _context2.next = 21;
81
58
  break;
82
59
  }
83
-
84
60
  _context2.next = 3;
85
61
  return _inquirer["default"].prompt({
86
62
  name: 'add-server',
@@ -88,22 +64,18 @@ function _addNewServer() {
88
64
  message: 'Do you want to add a server?',
89
65
  "default": false
90
66
  });
91
-
92
67
  case 3:
93
68
  addServer = _context2.sent['add-server'];
94
-
95
69
  if (!addServer) {
96
70
  _context2.next = 18;
97
71
  break;
98
72
  }
99
-
100
73
  _context2.next = 7;
101
74
  return _inquirer["default"].prompt({
102
75
  name: 'server-name',
103
76
  type: 'input',
104
77
  message: 'Enter a name:'
105
78
  });
106
-
107
79
  case 7:
108
80
  name = _context2.sent['server-name'];
109
81
  _context2.next = 10;
@@ -112,12 +84,10 @@ function _addNewServer() {
112
84
  type: 'input',
113
85
  message: 'Enter a URL:'
114
86
  });
115
-
116
87
  case 10:
117
88
  url = _context2.sent['server-url'];
118
89
  _context2.next = 13;
119
90
  return _inquirer["default"].prompt(generateKeyQ(name, url));
120
-
121
91
  case 13:
122
92
  _context2.t0 = name;
123
93
  key = _context2.sent[_context2.t0];
@@ -127,14 +97,11 @@ function _addNewServer() {
127
97
  };
128
98
  _context2.next = 19;
129
99
  break;
130
-
131
100
  case 18:
132
101
  return _context2.abrupt("break", 21);
133
-
134
102
  case 19:
135
103
  _context2.next = 0;
136
104
  break;
137
-
138
105
  case 21:
139
106
  case "end":
140
107
  return _context2.stop();
@@ -144,25 +111,20 @@ function _addNewServer() {
144
111
  }));
145
112
  return _addNewServer.apply(this, arguments);
146
113
  }
147
-
148
114
  function config(args) {
149
115
  var nOptions = Object.keys(args).length - 1;
150
116
  var interactiveMode = args['_'].length === 1 && (nOptions < 1 || nOptions === 1 && args.reset);
151
117
  var hasAddServerCommand = args['_'].length === 2 && args['_'][1] === 'add' && args.server && args.key && args.k && args.alias && (nOptions === 4 || nOptions === 5 && args["default"]);
152
118
  if (!interactiveMode && !hasAddServerCommand) return false;
153
-
154
119
  if (!_fs["default"].existsSync(grokDir)) {
155
120
  _fs["default"].mkdirSync(grokDir);
156
121
  }
157
-
158
122
  if (!_fs["default"].existsSync(confPath) || args.reset) {
159
123
  _fs["default"].writeFileSync(confPath, _jsYaml["default"].dump(confTemplate));
160
124
  }
161
-
162
125
  var config = _jsYaml["default"].load(_fs["default"].readFileSync(confPath, {
163
126
  encoding: 'utf-8'
164
127
  }));
165
-
166
128
  if (hasAddServerCommand) {
167
129
  try {
168
130
  new URL(args.server);
@@ -170,32 +132,25 @@ function config(args) {
170
132
  color.error('URL parsing error. Please, provide a valid server URL.');
171
133
  return false;
172
134
  }
173
-
174
135
  config.servers[args.alias] = {
175
136
  url: args.server,
176
137
  key: args.key
177
138
  };
178
139
  color.success("Successfully added the server to ".concat(confPath, "."));
179
140
  console.log("Use this command to deploy packages: grok publish ".concat(args.alias));
180
-
181
141
  if (args["default"]) {
182
142
  config["default"] = args.alias;
183
143
  }
184
-
185
144
  _fs["default"].writeFileSync(confPath, _jsYaml["default"].dump(config));
186
-
187
145
  return true;
188
146
  }
189
-
190
147
  console.log("Your config file (".concat(confPath, "):"));
191
148
  console.log(config);
192
149
  var valRes = (0, _configValidator.validateConf)(config);
193
-
194
150
  if (!config || !valRes.value) {
195
151
  color.error(valRes.message);
196
152
  return false;
197
153
  }
198
-
199
154
  if (valRes.warnings.length) color.warn(valRes.warnings.join('\n'));
200
155
  (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
201
156
  var answers, server, url, question, devKey, defaultServer;
@@ -211,40 +166,32 @@ function config(args) {
211
166
  message: 'Do you want to edit it?',
212
167
  "default": false
213
168
  });
214
-
215
169
  case 3:
216
170
  answers = _context.sent;
217
-
218
171
  if (!answers['edit-config']) {
219
172
  _context.next = 24;
220
173
  break;
221
174
  }
222
-
223
175
  _context.t0 = _regenerator["default"].keys(config.servers);
224
-
225
176
  case 6:
226
177
  if ((_context.t1 = _context.t0()).done) {
227
178
  _context.next = 17;
228
179
  break;
229
180
  }
230
-
231
181
  server = _context.t1.value;
232
182
  url = config['servers'][server]['url'];
233
183
  question = generateKeyQ(server, url);
234
184
  question["default"] = config['servers'][server]['key'];
235
185
  _context.next = 13;
236
186
  return _inquirer["default"].prompt(question);
237
-
238
187
  case 13:
239
188
  devKey = _context.sent;
240
189
  config['servers'][server]['key'] = devKey[server];
241
190
  _context.next = 6;
242
191
  break;
243
-
244
192
  case 17:
245
193
  _context.next = 19;
246
194
  return addNewServer(config);
247
-
248
195
  case 19:
249
196
  _context.next = 21;
250
197
  return _inquirer["default"].prompt({
@@ -260,24 +207,19 @@ function config(args) {
260
207
  },
261
208
  "default": config["default"]
262
209
  });
263
-
264
210
  case 21:
265
211
  defaultServer = _context.sent;
266
212
  config["default"] = defaultServer['default-server'];
267
-
268
213
  _fs["default"].writeFileSync(confPath, _jsYaml["default"].dump(config));
269
-
270
214
  case 24:
271
215
  _context.next = 31;
272
216
  break;
273
-
274
217
  case 26:
275
218
  _context.prev = 26;
276
219
  _context.t2 = _context["catch"](0);
277
220
  color.error('The file is corrupted. Please run `grok config --reset` to restore the default template');
278
221
  console.error(_context.t2);
279
222
  return _context.abrupt("return", false);
280
-
281
223
  case 31:
282
224
  case "end":
283
225
  return _context.stop();
@@ -285,8 +227,6 @@ function config(args) {
285
227
  }
286
228
  }, _callee, null, [[0, 26]]);
287
229
  }))();
288
-
289
230
  _fs["default"].writeFileSync(confPath, _jsYaml["default"].dump(config));
290
-
291
231
  return true;
292
232
  }
@@ -1,82 +1,50 @@
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.create = create;
11
-
12
9
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
-
14
10
  var _fs = _interopRequireDefault(require("fs"));
15
-
16
11
  var _path = _interopRequireDefault(require("path"));
17
-
18
12
  var _os = _interopRequireDefault(require("os"));
19
-
20
13
  var _jsYaml = _interopRequireDefault(require("js-yaml"));
21
-
22
14
  var _child_process = require("child_process");
23
-
24
15
  var _entHelpers = require("../utils/ent-helpers");
25
-
26
16
  var utils = _interopRequireWildcard(require("../utils/utils"));
27
-
28
17
  var color = _interopRequireWildcard(require("../utils/color-utils"));
29
-
30
18
  var _configValidator = require("../validators/config-validator");
31
-
32
19
  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); }
33
-
34
20
  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; }
35
-
36
21
  var platform = _os["default"].platform();
37
-
38
22
  var curDir = process.cwd();
39
-
40
23
  var curFolder = _path["default"].basename(curDir);
41
-
42
24
  var grokDir = _path["default"].join(_os["default"].homedir(), '.grok');
43
-
44
25
  var confPath = _path["default"].join(grokDir, 'config.yaml');
45
-
46
26
  var templateDir = _path["default"].join(_path["default"].dirname(_path["default"].dirname(__dirname)), 'package-template');
47
-
48
27
  var confTemplateDir = _path["default"].join(_path["default"].dirname(_path["default"].dirname(__dirname)), 'config-template.yaml');
49
-
50
28
  var confTemplate = _jsYaml["default"].load(_fs["default"].readFileSync(confTemplateDir, {
51
29
  encoding: 'utf-8'
52
30
  }));
53
-
54
31
  var dependencies = [];
55
-
56
32
  function createDirectoryContents(name, config, templateDir, packageDir) {
57
33
  var ide = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '';
58
34
  var ts = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;
59
35
  var eslint = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : false;
60
36
  var test = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : false;
61
-
62
37
  var filesToCreate = _fs["default"].readdirSync(templateDir);
63
-
64
38
  filesToCreate.forEach(function (file) {
65
39
  var origFilePath = _path["default"].join(templateDir, file);
66
-
67
40
  var copyFilePath = _path["default"].join(packageDir, file);
68
-
69
41
  var stats = _fs["default"].statSync(origFilePath);
70
-
71
42
  if (stats.isFile()) {
72
43
  if (file === 'package.png') {
73
44
  _fs["default"].writeFileSync(copyFilePath, _fs["default"].readFileSync(origFilePath, 'base64'), 'base64');
74
-
75
45
  return false;
76
46
  }
77
-
78
47
  var contents = _fs["default"].readFileSync(file === 'webpack.config.js' && ts ? _path["default"].join(templateDir, 'ts.webpack.config.js') : origFilePath, 'utf8');
79
-
80
48
  contents = contents.replace(/#{PACKAGE_NAME}/g, name);
81
49
  contents = contents.replace(/#{PACKAGE_DETECTORS_NAME}/g, utils.kebabToCamelCase(name));
82
50
  contents = contents.replace(/#{PACKAGE_NAME_LOWERCASE}/g, name.toLowerCase());
@@ -84,22 +52,18 @@ function createDirectoryContents(name, config, templateDir, packageDir) {
84
52
  contents = utils.replacers['PACKAGE_NAMESPACE'](contents, name);
85
53
  contents = contents.replace(/#{GROK_HOST_ALIAS}/g, config["default"]);
86
54
  contents = contents.replace(/#{GROK_HOST}/g, /localhost|127\.0\.0\.1/.test(config['servers'][config["default"]]['url']) ? 'http://localhost:63343/login.html' : new URL(config['servers'][config["default"]]['url']).origin);
87
-
88
55
  if (file === 'package.json') {
89
56
  // Generate scripts for non-default servers from `config.yaml`
90
57
  var _package = JSON.parse(contents);
91
-
92
58
  for (var server in config.servers) {
93
59
  if (server === config["default"]) continue;
94
60
  _package['scripts']["debug-".concat(name.toLowerCase(), "-").concat(server)] = "webpack && grok publish ".concat(server);
95
61
  _package['scripts']["release-".concat(name.toLowerCase(), "-").concat(server)] = "webpack && grok publish ".concat(server, " --release");
96
62
  }
97
-
98
63
  if (ts) Object.assign(_package.devDependencies, {
99
64
  'ts-loader': 'latest',
100
65
  'typescript': 'latest'
101
66
  });
102
-
103
67
  if (eslint) {
104
68
  Object.assign(_package.devDependencies, {
105
69
  'eslint': 'latest',
@@ -113,7 +77,6 @@ function createDirectoryContents(name, config, templateDir, packageDir) {
113
77
  'lint-fix': "eslint src".concat(ts ? ' --ext .ts' : '', " --fix")
114
78
  });
115
79
  }
116
-
117
80
  if (test) {
118
81
  Object.assign(_package.dependencies, {
119
82
  '@datagrok-libraries/utils': 'latest'
@@ -121,58 +84,47 @@ function createDirectoryContents(name, config, templateDir, packageDir) {
121
84
  Object.assign(_package.scripts, {
122
85
  'test': 'grok test'
123
86
  });
124
- } // Save module names for installation prompt
125
-
87
+ }
126
88
 
89
+ // Save module names for installation prompt
127
90
  for (var _i = 0, _Object$entries = Object.entries(Object.assign({}, _package.dependencies, _package.devDependencies)); _i < _Object$entries.length; _i++) {
128
91
  var _Object$entries$_i = (0, _slicedToArray2["default"])(_Object$entries[_i], 2),
129
- module = _Object$entries$_i[0],
130
- tag = _Object$entries$_i[1];
131
-
92
+ module = _Object$entries$_i[0],
93
+ tag = _Object$entries$_i[1];
132
94
  dependencies.push("".concat(module, "@").concat(tag));
133
95
  }
134
-
135
- contents = JSON.stringify(_package, null, '\t');
96
+ contents = JSON.stringify(_package, null, 2);
136
97
  }
137
-
138
98
  if (file === 'package.js' && ts) copyFilePath = _path["default"].join(packageDir, 'package.ts');
139
99
  if (file === 'package-test.js' && ts) return false;
140
100
  if (file === 'package-test.ts' && !ts) return false;
141
101
  if (file === 'tsconfig.json' && !ts) return false;
142
102
  if (file === 'ts.webpack.config.js') return false;
143
-
144
103
  if (file === '.eslintrc.json') {
145
104
  if (!eslint) return false;
146
-
147
105
  if (ts) {
148
106
  var eslintConf = JSON.parse(contents);
149
107
  eslintConf.parser = '@typescript-eslint/parser';
150
108
  eslintConf.plugins = ['@typescript-eslint'];
151
- contents = JSON.stringify(eslintConf, null, '\t');
109
+ contents = JSON.stringify(eslintConf, null, 2);
152
110
  }
153
111
  }
154
-
155
112
  if (file === 'gitignore') {
156
113
  copyFilePath = _path["default"].join(packageDir, '.gitignore');
157
114
  if (ts) contents += '\n# Emitted *.js files\nsrc/**/*.js\n';
158
115
  }
159
-
160
116
  if (file === 'npmignore') {
161
117
  copyFilePath = _path["default"].join(packageDir, '.npmignore');
162
118
  }
163
-
164
119
  _fs["default"].writeFileSync(copyFilePath, contents, 'utf8');
165
120
  } else if (stats.isDirectory()) {
166
121
  if (file === '.vscode' && !(ide == 'vscode' && platform == 'win32')) return;
167
-
168
- _fs["default"].mkdirSync(copyFilePath); // recursive call
169
-
170
-
122
+ _fs["default"].mkdirSync(copyFilePath);
123
+ // recursive call
171
124
  createDirectoryContents(name, config, origFilePath, copyFilePath, ide, ts, eslint, test);
172
125
  }
173
126
  });
174
127
  }
175
-
176
128
  function create(args) {
177
129
  var options = ['ide', 'js', 'ts', 'eslint', 'test'];
178
130
  var nOptions = Object.keys(args).length - 1;
@@ -182,43 +134,35 @@ function create(args) {
182
134
  return options.includes(op);
183
135
  })) return false;
184
136
  if (args.js && args.ts) return color.error('Incompatible options: --js and --ts');
185
- var ts = !args.js && args.ts !== false; // Create `config.yaml` if it doesn't exist yet
137
+ var ts = !args.js && args.ts !== false;
186
138
 
139
+ // Create `config.yaml` if it doesn't exist yet
187
140
  if (!_fs["default"].existsSync(grokDir)) _fs["default"].mkdirSync(grokDir);
188
141
  if (!_fs["default"].existsSync(confPath)) _fs["default"].writeFileSync(confPath, _jsYaml["default"].dump(confTemplate));
189
-
190
142
  var config = _jsYaml["default"].load(_fs["default"].readFileSync(confPath, {
191
143
  encoding: 'utf-8'
192
144
  }));
193
-
194
145
  var confTest = (0, _configValidator.validateConf)(config);
195
-
196
146
  if (!confTest.value) {
197
147
  color.error(confTest.message);
198
148
  return false;
199
149
  }
200
-
201
150
  var name = nArgs === 2 ? args['_'][1] : curFolder;
202
151
  var validName = /^([A-Za-z\-_\d])+$/.test(name);
203
-
204
152
  if (validName) {
205
153
  var packageDir = curDir;
206
154
  var repositoryInfo = null;
207
-
208
155
  if (curFolder !== name) {
209
156
  packageDir = _path["default"].join(packageDir, name);
210
-
211
157
  if (!_fs["default"].existsSync(packageDir)) {
212
158
  _fs["default"].mkdirSync(packageDir);
213
159
  }
214
160
  }
215
-
216
161
  if (!utils.isEmpty(packageDir)) {
217
162
  console.log();
218
163
  color.error('The package directory should be empty');
219
164
  return false;
220
165
  }
221
-
222
166
  (0, _child_process.exec)('git rev-parse --is-inside-work-tree', {
223
167
  cwd: packageDir
224
168
  }, function (err) {
@@ -244,13 +188,10 @@ function create(args) {
244
188
  process.on('beforeExit', function () {
245
189
  if (repositoryInfo) {
246
190
  var packagePath = _path["default"].join(packageDir, 'package.json');
247
-
248
191
  var p = JSON.parse(_fs["default"].readFileSync(packagePath, 'utf-8'));
249
192
  p.repository = repositoryInfo;
250
-
251
- _fs["default"].writeFileSync(packagePath, JSON.stringify(p, null, '\t'), 'utf-8');
193
+ _fs["default"].writeFileSync(packagePath, JSON.stringify(p, null, 2), 'utf-8');
252
194
  }
253
-
254
195
  process.exit();
255
196
  });
256
197
  createDirectoryContents(name, config, templateDir, packageDir, args.ide, ts, !!args.eslint, !!args.test);
@@ -266,6 +207,5 @@ function create(args) {
266
207
  } else {
267
208
  color.error('Package name may only include letters, numbers, underscores, or hyphens');
268
209
  }
269
-
270
210
  return true;
271
211
  }
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.help = void 0;
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 check Check package content (function signatures, etc.)\n config Create and manage config files\n create Create a package\n init Modify a package template\n link Link `datagrok-api` and libraries for local development\n unlink Revert `grok link`\n publish Upload a package\n test Run package tests\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";
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 check Check package content (function signatures, etc.)\n config Create and manage config files\n create Create a package\n init Modify a package template\n link Link `datagrok-api` and libraries for local development\n publish Upload a package\n test Run package tests\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>\ngrok add tests\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_INIT = "\nUsage: grok init\n\nModify a package template by adding config files for linters, IDE, etc.\n\nOptions:\n[--eslint] [--ide] [--test] [--ts]\n\n--eslint Add a configuration for eslint\n--ide Add an IDE-specific configuration for debugging (vscode)\n--test Add tests support (TypeScript packages only)\n--ts Convert a JavaScript package to TypeScript\n";
10
10
  var HELP_API = "\nUsage: grok api\n\nCreate wrapper functions for package scripts and queries\n";
@@ -13,8 +13,7 @@ var HELP_CREATE = "\nUsage: grok create [name]\n\nCreate a package:\n\ngrok crea
13
13
  var HELP_PUBLISH = "\nUsage: grok publish [host]\n\nUpload a package\n\nOptions:\n[--build|--rebuild] [--debug|--release] [-k | --key] [--suffix]\n\nRunning `grok publish` is the same as running `grok publish defaultHost --build --debug`\n";
14
14
  var HELP_CHECK = "\nUsage: grok check\n\nOptions:\n[-r | --recursive]\n\n--recursive Check all packages in the current directory\n\nCheck package content (function signatures, import statements of external modules, etc.)\n";
15
15
  var HELP_TEST = "\nUsage: grok test\n\nOptions:\n[--host] [--csv]\n\n--host Host alias as in the config file\n--csv Save the test report in a CSV file\n--gui Launch graphical interface (non-headless mode)\n--skip-build Skip the package build step\n--skip-publish Skip the package publication step\n\nRun package tests\n\nSee instructions:\nhttps://datagrok.ai/help/develop/how-to/test-packages#local-testing\n";
16
- var HELP_LINK = "\nUsage: grok link\n\nLink `datagrok-api` and libraries for local development\n";
17
- var HELP_UNLINK = "\nUsage: grok unlink\n\nRevert `grok link`\n";
16
+ var HELP_LINK = "\nUsage: grok link\n\nLink `datagrok-api` and libraries for local development\n\nOptions:\n[--local | --npm]\n\n--local Default. Links libraries and updates package scripts (\"link-all\", \"build-all\")\n--npm Unlinks local packages and runs `npm i`\n";
18
17
  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";
19
18
  var help = {
20
19
  add: HELP_ADD,
@@ -24,7 +23,6 @@ var help = {
24
23
  create: HELP_CREATE,
25
24
  init: HELP_INIT,
26
25
  link: HELP_LINK,
27
- unlink: HELP_UNLINK,
28
26
  publish: HELP_PUBLISH,
29
27
  test: HELP_TEST,
30
28
  help: HELP