datagrok-tools 4.14.0 → 4.14.2

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/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Datagrok-tools changelog
2
2
 
3
+ ## 4.14.2 (2025-05-16)
4
+
5
+ ### Features
6
+
7
+ * Grok Link added path mode
8
+ * Grok Link added unlink mode
9
+
3
10
  ## 4.14.0 (2025-05-12)
4
11
 
5
12
  ### Features
@@ -195,6 +195,8 @@ Link \`datagrok-api\` and libraries for local development
195
195
 
196
196
  Options:
197
197
  --dev Links also dev dependencies
198
+ --path Instead of npm linking sets dependecies in package.json to local
199
+ --unlink Unlinks packages and sets last versions instead of local path in package.json dependecies
198
200
  --verbose Prints detailed information about linked packages
199
201
  `;
200
202
 
@@ -11,10 +11,10 @@ var _utils = require("../utils/utils");
11
11
  /* eslint-disable valid-jsdoc */
12
12
 
13
13
  const repositoryDirNameRegex = new RegExp(_path.default.join('1', '2')[1] + 'public$');
14
- const excludedPackages = ['@datagrok/diff-grok'];
14
+ const excludedPackages = ['@datagrok/diff-grok', ''];
15
15
  const curDir = process.cwd();
16
- let devMode = false;
17
16
  let repositoryDir = curDir;
17
+ let currentPackage;
18
18
  let localPackageDependencies;
19
19
  let packagesToLink;
20
20
  while (_path.default.dirname(repositoryDir) !== repositoryDir) {
@@ -22,6 +22,9 @@ while (_path.default.dirname(repositoryDir) !== repositoryDir) {
22
22
  repositoryDir = _path.default.dirname(repositoryDir);
23
23
  }
24
24
  let verbose = false;
25
+ let pathMode = false;
26
+ let devMode = false;
27
+ let unlink = false;
25
28
  const apiDir = _path.default.join(repositoryDir, 'js-api');
26
29
  const libDir = _path.default.join(repositoryDir, 'libraries');
27
30
  const packageDir = _path.default.join(repositoryDir, 'packages');
@@ -30,22 +33,38 @@ const libName = '@datagrok-libraries/';
30
33
  const packageName = '@datagrok/';
31
34
  async function link(args) {
32
35
  verbose = args.verbose ?? false;
36
+ devMode = args.dev ?? false;
37
+ pathMode = args.path ?? false;
38
+ unlink = args.unlink ?? false;
33
39
  localPackageDependencies = [];
34
40
  packagesToLink = new Set();
35
- if (args.dev !== undefined) devMode = args.dev;
36
41
  collectPackagesData(curDir);
37
- await linkPackages();
38
- console.log('Package linked');
42
+ currentPackage = new PackageData(curDir);
43
+ if (unlink) {
44
+ await unlinkPackages();
45
+ console.log('Package unlinked');
46
+ } else {
47
+ await linkPackages();
48
+ if (pathMode) console.log('Updated dependencies to local in package.json');else console.log('All packages/libraries linked to your package by nmp link command');
49
+ }
39
50
  return true;
40
51
  }
41
52
  function collectPackagesData(packagePath = curDir) {
42
53
  const packageJsonPath = _path.default.join(packagePath, 'package.json');
43
- if (!_fs.default.existsSync(packageJsonPath)) return [];
54
+ if (!_fs.default.existsSync(packageJsonPath)) return {
55
+ dependencies: [],
56
+ version: '0.0.1',
57
+ name: ''
58
+ };
44
59
  const json = JSON.parse(_fs.default.readFileSync(packageJsonPath, 'utf-8'));
45
- let result = [];
46
- result = result.concat(collectPacakgeDataFromJsonObject(json.dependencies));
47
- if (devMode) result = result.concat(collectPacakgeDataFromJsonObject(json.devDependencies));
48
- return result;
60
+ let dependencies = [];
61
+ dependencies = dependencies.concat(collectPacakgeDataFromJsonObject(json.dependencies));
62
+ if (devMode) dependencies = dependencies.concat(collectPacakgeDataFromJsonObject(json.devDependencies));
63
+ return {
64
+ dependencies: dependencies,
65
+ version: json.version,
66
+ name: json.name
67
+ };
49
68
  }
50
69
  function collectPacakgeDataFromJsonObject(object) {
51
70
  let result = [];
@@ -62,11 +81,38 @@ function parsePackageDependencies(dependencyName, pathToLink) {
62
81
  let result = [];
63
82
  if (!packagesToLink.has(dependencyName)) {
64
83
  packagesToLink.add(dependencyName);
65
- localPackageDependencies.push(new PackageData(dependencyName, pathToLink));
84
+ localPackageDependencies.push(new PackageData(pathToLink));
66
85
  }
67
86
  result.push(dependencyName);
68
87
  return result;
69
88
  }
89
+ async function unlinkPackages() {
90
+ const packaegs = [...localPackageDependencies];
91
+ if (currentPackage) packaegs.push(currentPackage);
92
+ for (let packageData of packaegs) {
93
+ if (excludedPackages.includes(packageData.name)) continue;
94
+ if (verbose) console.log(`Package ${packageData.name} is unlinking`);
95
+ const packageJsonPath = _path.default.join(packageData.packagePath, 'package.json');
96
+ const packageJson = JSON.parse(_fs.default.readFileSync(packageJsonPath, 'utf8'));
97
+ packageJson.dependencies = updateDependenciesToVersion(packageData, packageJson.dependencies);
98
+ if (devMode) packageJson.devDependencies = updateDependenciesToVersion(packageData, packageJson.devDependencies);
99
+ _fs.default.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
100
+ await (0, _utils.runScript)(`npm unlink ${packageData.name}`, packageData.packagePath);
101
+ }
102
+ }
103
+ function updateDependenciesToVersion(packageData, dependecyNode) {
104
+ for (let dependency of packageData.dependencies) {
105
+ if (excludedPackages.includes(dependency)) continue;
106
+ if (dependecyNode[dependency]) {
107
+ const packageToLink = (localPackageDependencies.filter(e => e.name === dependency) ?? [])[0];
108
+ if (packageToLink) {
109
+ const startIndex = packageToLink.packagePath.indexOf(`public${_path.default.sep}`) + `public${_path.default.sep}`.length;
110
+ if (startIndex !== -1) dependecyNode[dependency] = `^${packageToLink.version}`;
111
+ }
112
+ }
113
+ }
114
+ return dependecyNode;
115
+ }
70
116
  async function linkPackages() {
71
117
  let anyChanges = true;
72
118
  for (let element of excludedPackages) packagesToLink.delete(element);
@@ -79,24 +125,56 @@ async function linkPackages() {
79
125
  let mapElements = localPackageDependencies.filter(x => x.dependencies.every(i => !packagesToLink.has(i)) && packagesToLink.has(x.name) && !excludedPackages.includes(x.name));
80
126
  if (mapElements.length === 0) break;
81
127
  for (let element of mapElements) {
82
- if (verbose) console.log(`Package ${element.name} linked`);
128
+ if (verbose) console.log(`Package ${element.name} is linking`);
129
+ if (pathMode) await linkPathMode(element);
83
130
  await (0, _utils.runScript)(`npm install`, element.packagePath);
84
- await (0, _utils.runScript)(`npm link ${element.dependencies.join(' ')}`, element.packagePath);
85
- await (0, _utils.runScript)(`npm link`, element.packagePath);
131
+ if (pathMode) await (0, _utils.runScript)(`npm run build`, element.packagePath);
132
+ if (!pathMode) await linkNpmMode(element);
86
133
  packagesToLink.delete(element.name);
87
134
  anyChanges = true;
88
135
  }
89
136
  if (anyChanges === false) throw new Error(`There is loop with next packages: ${JSON.stringify(Array.from(packagesToLink)).toString()}`);
90
137
  }
91
138
  let names = localPackageDependencies.map(x => x.name);
139
+ if (currentPackage && pathMode) await linkPathMode(currentPackage);
92
140
  await (0, _utils.runScript)(`npm install`, curDir);
93
- await (0, _utils.runScript)(`npm link ${names.join(' ')}`, curDir);
141
+ if (pathMode === false) await (0, _utils.runScript)(`npm link ${names.join(' ')}`, curDir);
142
+ }
143
+ async function linkNpmMode(packageData) {
144
+ await (0, _utils.runScript)(`npm link ${packageData.dependencies.join(' ')}`, packageData.packagePath);
145
+ await (0, _utils.runScript)(`npm link`, packageData.packagePath);
146
+ }
147
+ async function linkPathMode(packageData) {
148
+ const packageJsonPath = _path.default.join(packageData.packagePath, 'package.json');
149
+ const packageJson = JSON.parse(_fs.default.readFileSync(packageJsonPath, 'utf8'));
150
+ packageJson.dependencies = packageJson.dependencies || {};
151
+ packageJson.devDependencies = packageJson.devDependencies || {};
152
+ packageJson.dependencies = updateDependenciesToLocal(packageData, packageJson.dependencies);
153
+ if (devMode) packageJson.devDependencies = updateDependenciesToLocal(packageData, packageJson.devDependencies);
154
+ _fs.default.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
155
+ }
156
+ function updateDependenciesToLocal(packageData, dependecyNode) {
157
+ const dirNames = packageData.packagePath.split(_path.default.sep);
158
+ const backRoute = `../`.repeat(dirNames.length - dirNames.indexOf('public') - 1);
159
+ for (let dependency of packageData.dependencies) {
160
+ if (excludedPackages.includes(dependency)) continue;
161
+ if (dependecyNode[dependency]) {
162
+ const packageToLink = (localPackageDependencies.filter(e => e.name === dependency) ?? [])[0];
163
+ if (packageToLink) {
164
+ const startIndex = packageToLink.packagePath.indexOf(`public${_path.default.sep}`) + `public${_path.default.sep}`.length;
165
+ if (startIndex !== -1) dependecyNode[dependency] = `${backRoute}${packageToLink.packagePath.substring(startIndex).replaceAll(_path.default.sep, '/')}`;
166
+ }
167
+ }
168
+ }
169
+ return dependecyNode;
94
170
  }
95
171
  class PackageData {
96
172
  dependencies = [];
97
- constructor(name, packagePath) {
98
- this.name = name;
173
+ constructor(packagePath) {
174
+ let packageJsonData = collectPackagesData(packagePath);
175
+ this.name = packageJsonData.name;
99
176
  this.packagePath = packagePath;
100
- this.dependencies = collectPackagesData(packagePath);
177
+ this.dependencies = packageJsonData.dependencies;
178
+ this.version = packageJsonData.version;
101
179
  }
102
180
  }
@@ -375,10 +375,11 @@ const reservedDecorators = exports.reservedDecorators = {
375
375
  function generateClassFunc(annotation, className, sep = '\n') {
376
376
  return annotation + `export function _${className}() {${sep} return new ${className}();${sep}}${sep.repeat(2)}`;
377
377
  }
378
+ const primitives = new Set(['string', 'string[]', 'number', 'number[]', 'boolean', 'boolean[]']);
378
379
 
379
380
  /** Generates a DG function. */
380
381
  function generateFunc(annotation, funcName, sep = '\n', className = '', inputs = [], isAsync = false) {
381
- let funcSigNature = inputs.map(e => `${e.name}: ${e.type}`).join(', ');
382
+ let funcSigNature = inputs.map(e => `${e.name}: ${primitives.has(e.type ?? '') ? e.type : 'any'}`).join(', ');
382
383
  let funcArguments = inputs.map(e => e.name).join(', ');
383
384
  return annotation + `export ${isAsync ? 'async ' : ''}function ${funcName}(${funcSigNature}) {${sep} return ${className.length > 0 ? `${className}.` : ''}${funcName}(${funcArguments});${sep}}${sep.repeat(2)}`;
384
385
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "datagrok-tools",
3
- "version": "4.14.0",
3
+ "version": "4.14.2",
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": {
@@ -179,10 +179,11 @@ class FuncGeneratorPlugin {
179
179
  name += ': ' + generate(baseParam.argument.typeAnnotation.typeAnnotation).code;
180
180
 
181
181
  let type = '';
182
- if (baseParam?.typeAnnotation?.typeAnnotation?.typeName || baseParam?.typeAnnotation?.typeAnnotation?.elementType?.typeName)
183
- type = 'any';
184
- else if (baseParam?.typeAnnotation?.typeAnnotation)
182
+ if (baseParam?.typeAnnotation?.typeAnnotation)
185
183
  type = generate(baseParam.typeAnnotation.typeAnnotation).code;
184
+ else
185
+ type = 'any';
186
+
186
187
  let params = baseParam.typeAnnotation.typeAnnotation.typeArguments?.params;
187
188
  if(type !== 'any' && params && params.length > 0)
188
189
  type += `<${params.map((e)=>e.typeName.name).join(',')}>`;