datagrok-tools 4.14.12 → 4.14.14

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.14 (2025-06-16)
4
+
5
+ ### Features
6
+
7
+ * Grok Link added ability to link packages from root directory
8
+ * Grok Link added repo-only option
9
+
3
10
  ## 4.14.10 (2025-06-08)
4
11
 
5
12
  ### Features
@@ -175,13 +175,13 @@ Options:
175
175
  --link-package Link the packages to local utils
176
176
  --record Records the test execution process in mp4 format
177
177
  --verbose Prints detailed information about passed and skipped tests in the console
178
- --core Runs packages & core tests (applicable for DevTools packages only)
178
+ --core Runs packages & core tests (applicable for DevTools packages only)
179
179
  --benchmark Runs tests in benchmark mode
180
180
  --stress-test Runs shuffled stress-test only
181
181
  --order Specify order for tests invocation
182
182
  --tags Filter tests by tag name for run
183
183
  --testRepeat Set amount of tests repeats
184
- --browsers-count Set amount of browsers for tests run
184
+ --browsers-count Set amount of browsers for tests run
185
185
 
186
186
  Run tests of all or specified packages
187
187
 
@@ -191,11 +191,14 @@ https://datagrok.ai/help/develop/how-to/test-packages#local-testing
191
191
  const HELP_LINK = `
192
192
  Usage: grok link
193
193
 
194
- Link \`datagrok-api\`, all necessary libraries and packages for local development by \`npm link\` command
194
+ Links \`datagrok-api\`, all necessary libraries and packages for local development.
195
+ Uses \`npm link\` unless the --path option specified.
196
+ By default, it links packages from the parent directory of the repository's root.
195
197
 
196
198
  Options:
197
199
  --dev Links also dev dependencies
198
- --path Instead of npm linking sets dependecies in package.json to local
200
+ --path Instead of npm link, sets dependencies in package.json to local
201
+ --repo-only Links packages only from the current repository
199
202
  --unlink Unlinks packages and sets last versions instead of local path in package.json dependencies
200
203
  --verbose Prints detailed information about linked packages
201
204
  `;
@@ -8,37 +8,42 @@ exports.link = link;
8
8
  var _fs = _interopRequireDefault(require("fs"));
9
9
  var _path = _interopRequireDefault(require("path"));
10
10
  var _utils = require("../utils/utils");
11
+ var _glob = require("glob");
11
12
  /* eslint-disable valid-jsdoc */
12
13
 
13
- const repositoryDirNameRegex = new RegExp(_path.default.join('1', '2')[1] + 'public$');
14
- const excludedPackages = ['@datagrok/diff-grok', ''];
14
+ const excludedPackages = ['@datagrok-misc/eslint-plugin-config', 'wiki-merge', 'datagrok-tools', ''];
15
+ const versionDependencyRegex = /(?:\^)?\d+\.\d+\.\d+/;
16
+ let packagesInRepo;
17
+ let packagesOutOfRepo;
15
18
  const curDir = process.cwd();
16
19
  let repositoryDir = curDir;
20
+ let containerDir = curDir;
21
+ let dirStep = _path.default.dirname(curDir);
17
22
  let currentPackage;
18
23
  let localPackageDependencies;
19
24
  let packagesToLink;
20
- while (_path.default.dirname(repositoryDir) !== repositoryDir) {
21
- if (repositoryDirNameRegex.test(repositoryDir)) break;
22
- repositoryDir = _path.default.dirname(repositoryDir);
25
+ while (_path.default.dirname(dirStep) !== dirStep) {
26
+ if (_fs.default.existsSync(_path.default.join(dirStep, '.git')) && repositoryDir === curDir) repositoryDir = dirStep;
27
+ if (!_fs.default.existsSync(_path.default.join(dirStep, '.git')) && repositoryDir !== curDir && containerDir === curDir) {
28
+ containerDir = dirStep;
29
+ break;
30
+ }
31
+ dirStep = _path.default.dirname(dirStep);
23
32
  }
24
33
  let verbose = false;
25
34
  let pathMode = false;
26
35
  let devMode = false;
27
36
  let unlink = false;
28
- const apiDir = _path.default.join(repositoryDir, 'js-api');
29
- const libDir = _path.default.join(repositoryDir, 'libraries');
30
- const packageDir = _path.default.join(repositoryDir, 'packages');
31
- const apiPackageName = 'datagrok-api';
32
- const libName = '@datagrok-libraries/';
33
- const packageName = '@datagrok/';
34
37
  async function link(args) {
35
38
  verbose = args.verbose ?? false;
36
39
  devMode = args.dev ?? false;
37
40
  pathMode = args.path ?? false;
38
41
  unlink = args.unlink ?? false;
42
+ let collectedPackages = collectAvaliablePackages(args['repo-only']);
43
+ packagesInRepo = collectedPackages.packagesInRepo;
44
+ packagesOutOfRepo = collectedPackages.packagesOutOfRepo;
39
45
  localPackageDependencies = [];
40
46
  packagesToLink = new Set();
41
- collectPackagesData(curDir);
42
47
  currentPackage = new PackageData(curDir);
43
48
  if (unlink) {
44
49
  await unlinkPackages();
@@ -68,9 +73,8 @@ function collectPackagesData(packagePath = curDir) {
68
73
  }
69
74
  function collectPacakgeDataFromJsonObject(object) {
70
75
  let result = [];
71
- for (let dependencyName of Object.keys(object)) {
72
- let nameSplitted = dependencyName.split('/');
73
- if (dependencyName === apiPackageName) result = result.concat(parsePackageDependencies(dependencyName, apiDir));else if (dependencyName.includes(libName)) result = result.concat(parsePackageDependencies(dependencyName, _path.default.join(libDir, nameSplitted[nameSplitted.length - 1])));else if (dependencyName.includes(packageName)) result = result.concat(parsePackageDependencies(dependencyName, _path.default.join(packageDir, toCamelCase(nameSplitted[nameSplitted.length - 1]))));
76
+ for (let dependencyName of Object.keys(object ?? {})) {
77
+ if (packagesInRepo[dependencyName]) result = result.concat(parsePackageDependencies(dependencyName, _path.default.dirname(packagesInRepo[dependencyName].path)));else if (packagesOutOfRepo[dependencyName]) result = result.concat(parsePackageDependencies(dependencyName, _path.default.dirname(packagesOutOfRepo[dependencyName].path)));
74
78
  }
75
79
  return result;
76
80
  }
@@ -86,10 +90,49 @@ function parsePackageDependencies(dependencyName, pathToLink) {
86
90
  result.push(dependencyName);
87
91
  return result;
88
92
  }
93
+ function collectAvaliablePackages(noOutLink = false) {
94
+ let repositoryPackages = collectAvaliablePackagesPathesFromDir(repositoryDir);
95
+ let commonPakcages = collectAvaliablePackagesPathesFromDir(containerDir, repositoryDir);
96
+ const packagesInRepoBaseInfo = parsePackages(repositoryPackages);
97
+ const packagesOutOfRepoBaseInfo = noOutLink ? [] : parsePackages(commonPakcages);
98
+ const packagesInRepo = Object.fromEntries(packagesInRepoBaseInfo.map(({
99
+ name,
100
+ ...rest
101
+ }) => [name, rest]));
102
+ const packagesOutOfRepo = Object.fromEntries(packagesOutOfRepoBaseInfo.map(({
103
+ name,
104
+ ...rest
105
+ }) => [name, rest]));
106
+ return {
107
+ packagesInRepo: packagesInRepo,
108
+ packagesOutOfRepo: packagesOutOfRepo
109
+ };
110
+ }
111
+ function collectAvaliablePackagesPathesFromDir(dir, dirToExclude = '') {
112
+ let res = _glob.glob.sync('./**/package.json', {
113
+ cwd: dir,
114
+ ignore: ['**/node_modules/**']
115
+ }).map(e => _path.default.join(dir, e));
116
+ if (dirToExclude.length > 0) res = res.filter(e => !e.includes(dirToExclude));
117
+ return res;
118
+ }
119
+ function parsePackages(packagPathes) {
120
+ let res = packagPathes.map(e => {
121
+ let packageData = {};
122
+ if (_fs.default.existsSync(e)) {
123
+ packageData.path = e;
124
+ const packageJson = JSON.parse(_fs.default.readFileSync(e, 'utf8'));
125
+ packageData.name = packageJson.name;
126
+ packageData.version = packageJson.version;
127
+ }
128
+ return packageData;
129
+ });
130
+ return res;
131
+ }
89
132
  async function unlinkPackages() {
90
- const packaegs = [...localPackageDependencies];
91
- if (currentPackage) packaegs.push(currentPackage);
92
- for (let packageData of packaegs) {
133
+ const packages = [...localPackageDependencies];
134
+ if (currentPackage) packages.push(currentPackage);
135
+ for (let packageData of packages) {
93
136
  if (excludedPackages.includes(packageData.name)) continue;
94
137
  if (verbose) console.log(`Package ${packageData.name} is unlinking`);
95
138
  const packageJsonPath = _path.default.join(packageData.packagePath, 'package.json');
@@ -103,11 +146,10 @@ async function unlinkPackages() {
103
146
  function updateDependenciesToVersion(packageData, dependecyNode) {
104
147
  for (let dependency of packageData.dependencies) {
105
148
  if (excludedPackages.includes(dependency)) continue;
106
- if (dependecyNode[dependency]) {
149
+ if (dependecyNode[dependency] && !versionDependencyRegex.test(dependecyNode[dependency])) {
107
150
  const packageToLink = (localPackageDependencies.filter(e => e.name === dependency) ?? [])[0];
108
151
  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}`;
152
+ dependecyNode[dependency] = `^${packagesInRepo[dependency]?.version ?? packagesOutOfRepo[dependency]?.version}`;
111
153
  }
112
154
  }
113
155
  }
@@ -154,15 +196,14 @@ async function linkPathMode(packageData) {
154
196
  _fs.default.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
155
197
  }
156
198
  function updateDependenciesToLocal(packageData, dependecyNode) {
157
- const dirNames = packageData.packagePath.split(_path.default.sep);
158
- const backRoute = `../`.repeat(dirNames.length - dirNames.indexOf('public') - 1);
199
+ const backRouteForCont = `../`.repeat(packageData.packagePath.replace(containerDir, '').split(_path.default.sep).length - 1);
200
+ const backRouteForRepo = `../`.repeat(packageData.packagePath.replace(repositoryDir, '').split(_path.default.sep).length - 1);
159
201
  for (let dependency of packageData.dependencies) {
160
202
  if (excludedPackages.includes(dependency)) continue;
161
203
  if (dependecyNode[dependency]) {
162
204
  const packageToLink = (localPackageDependencies.filter(e => e.name === dependency) ?? [])[0];
163
205
  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, '/')}`;
206
+ if (packageToLink.packagePath.includes(repositoryDir) && packageData.packagePath.includes(repositoryDir)) dependecyNode[dependency] = `${backRouteForRepo}${packageToLink.packagePath.replace(repositoryDir, '').replaceAll(_path.default.sep, '/').replace('/', '')}`;else dependecyNode[dependency] = `${backRouteForCont}${packageToLink.packagePath.replace(containerDir, '').replaceAll(_path.default.sep, '/').replace('/', '')}`;
166
207
  }
167
208
  }
168
209
  }
@@ -67,6 +67,5 @@
67
67
  /* Advanced Options */
68
68
  "skipLibCheck": true, /* Skip type checking of declaration files. */
69
69
  "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */
70
- "declaration": true
71
70
  }
72
71
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "datagrok-tools",
3
- "version": "4.14.12",
3
+ "version": "4.14.14",
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": {