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 +7 -0
- package/bin/commands/help.js +5 -4
- package/bin/commands/link.js +66 -25
- package/bin/utils/utils.js +1 -1
- package/package-template/tsconfig.json +0 -1
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
package/bin/commands/help.js
CHANGED
|
@@ -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
|
|
198
|
-
--path
|
|
199
|
-
--
|
|
200
|
-
--
|
|
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 = `
|
package/bin/commands/link.js
CHANGED
|
@@ -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
|
|
14
|
-
const
|
|
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(
|
|
21
|
-
if (
|
|
22
|
-
|
|
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
|
-
|
|
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
|
|
91
|
-
if (currentPackage)
|
|
92
|
-
for (let packageData of
|
|
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
|
-
|
|
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
|
|
158
|
-
const
|
|
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
|
-
|
|
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
|
}
|
package/bin/utils/utils.js
CHANGED
|
@@ -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,
|
|
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)),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "datagrok-tools",
|
|
3
|
-
"version": "4.14.
|
|
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",
|