datagrok-tools 4.14.11 → 4.14.13

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.13 (2025-06-16)
4
+
5
+ ### Features
6
+
7
+ * Grok Link added ability to link packages from root directory
8
+ * Grok Link added without-common-dir
9
+
3
10
  ## 4.14.10 (2025-06-08)
4
11
 
5
12
  ### Features
@@ -194,10 +194,11 @@ Usage: grok link
194
194
  Link \`datagrok-api\`, all necessary libraries and packages for local development by \`npm link\` command
195
195
 
196
196
  Options:
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 dependencies
200
- --verbose Prints detailed information about linked packages
197
+ --dev Links also dev dependencies
198
+ --path Instead of npm linking sets dependecies in package.json to local
199
+ --without-common-dir Links packages only from the current repository
200
+ --unlink Unlinks packages and sets last versions instead of local path in package.json dependencies
201
+ --verbose Prints detailed information about linked packages
201
202
  `;
202
203
 
203
204
  // const HELP_MIGRATE = `
@@ -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['without-common-dir']);
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
  }
@@ -103,7 +103,7 @@ const replacers = exports.replacers = {
103
103
  NAME_LOWERCASE: (s, name) => s.replace(/#{NAME_LOWERCASE}/g, name.toLowerCase()),
104
104
  NAME_PREFIX: (s, name) => s.replace(/#{NAME_PREFIX}/g, name.slice(0, 3)),
105
105
  PACKAGE_DETECTORS_NAME: (s, name) => s.replace(/#{PACKAGE_DETECTORS_NAME}/g, kebabToCamelCase(name)),
106
- PACKAGE_NAMESPACE: (s, name) => s.replace(/#{PACKAGE_NAMESPACE}/g, kebabToCamelCase(removeScope(name))),
106
+ PACKAGE_NAMESPACE: (s, name) => s.replace(/#{PACKAGE_NAMESPACE}/g, name),
107
107
  FUNC_DESCRIPTION: (s, desc) => s.replace(/#{FUNC_DESCRIPTION}/g, descriptionToComment(desc)),
108
108
  FUNC_NAME: (s, name) => s.replace(/#{FUNC_NAME}/g, friendlyNameToName(name)),
109
109
  FUNC_NAME_LOWERCASE: (s, name) => s.replace(/#{FUNC_NAME_LOWERCASE}/g, friendlyNameToName(name, false)),
@@ -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.11",
3
+ "version": "4.14.13",
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": {
@@ -13,6 +13,7 @@
13
13
  "archiver-promise": "^1.0.0",
14
14
  "estraverse": "^5.3.0",
15
15
  "fs": "^0.0.1-security",
16
+ "glob": "^11.0.2",
16
17
  "ignore-walk": "^3.0.4",
17
18
  "inquirer": "^7.3.3",
18
19
  "js-yaml": "^4.1.0",