submodule-version 2.3.2 → 3.0.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.
- package/README.md +103 -20
- package/dist/runner/handleErrors/handleErrors.d.ts +1 -1
- package/dist/runner/handleErrors/handleErrors.js +3 -10
- package/dist/runner/handleErrors/handleErrors.js.map +1 -1
- package/dist/runner/index.js +0 -0
- package/dist/runner/runner.d.ts +4 -0
- package/dist/runner/runner.js +91 -37
- package/dist/runner/runner.js.map +1 -1
- package/dist/src/PubGrub/PubGrub.d.ts +28 -0
- package/dist/src/PubGrub/PubGrub.js +366 -0
- package/dist/src/PubGrub/PubGrub.js.map +1 -0
- package/dist/src/PubGrub/index.d.ts +2 -0
- package/dist/src/PubGrub/index.js +7 -0
- package/dist/src/PubGrub/index.js.map +1 -0
- package/dist/src/PubGrub/types.d.ts +56 -0
- package/dist/src/PubGrub/types.js +3 -0
- package/dist/src/PubGrub/types.js.map +1 -0
- package/dist/src/entryStore.d.ts +16 -0
- package/dist/src/entryStore.js +152 -0
- package/dist/src/entryStore.js.map +1 -0
- package/dist/src/errors.d.ts +28 -0
- package/dist/src/errors.js +30 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/git/api/GithubError.d.ts +4 -0
- package/dist/src/git/api/GithubError.js +11 -0
- package/dist/src/git/api/GithubError.js.map +1 -0
- package/dist/src/git/api/api.d.ts +8 -0
- package/dist/src/git/api/api.js +133 -0
- package/dist/src/git/api/api.js.map +1 -0
- package/dist/src/git/api/index.d.ts +3 -0
- package/dist/src/git/api/index.js +8 -0
- package/dist/src/git/api/index.js.map +1 -0
- package/dist/src/git/git.d.ts +30 -23
- package/dist/src/git/git.js +8 -258
- package/dist/src/git/git.js.map +1 -1
- package/dist/src/git/index.d.ts +1 -0
- package/dist/src/git/index.js +3 -1
- package/dist/src/git/index.js.map +1 -1
- package/dist/src/git/local/index.d.ts +1 -0
- package/dist/src/git/local/index.js +6 -0
- package/dist/src/git/local/index.js.map +1 -0
- package/dist/src/git/local/local.d.ts +26 -0
- package/dist/src/git/local/local.js +288 -0
- package/dist/src/git/local/local.js.map +1 -0
- package/dist/src/index.d.ts +7 -0
- package/dist/src/index.js +16 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/printError.d.ts +1 -0
- package/dist/src/printError.js +158 -0
- package/dist/src/printError.js.map +1 -0
- package/dist/src/sv.d.ts +18 -8
- package/dist/src/sv.js +235 -131
- package/dist/src/sv.js.map +1 -1
- package/dist/src/versionUtil/index.d.ts +2 -0
- package/dist/src/versionUtil/index.js +6 -0
- package/dist/src/versionUtil/index.js.map +1 -0
- package/dist/src/versionUtil/versionUtil.d.ts +16 -0
- package/dist/src/versionUtil/versionUtil.js +70 -0
- package/dist/src/versionUtil/versionUtil.js.map +1 -0
- package/package.json +4 -2
- package/runner/handleErrors/handleErrors.ts +3 -10
- package/runner/runner.ts +128 -46
- package/src/PubGrub/PubGrub.ts +578 -0
- package/src/PubGrub/__tests__/PubGrub.test.ts +351 -0
- package/src/PubGrub/index.ts +12 -0
- package/src/PubGrub/types.ts +72 -0
- package/src/__tests__/entryStore.test.ts +248 -0
- package/src/__tests__/printError.test.ts +148 -0
- package/src/__tests__/sv.test.ts +441 -0
- package/src/entryStore.ts +212 -0
- package/src/errors.ts +39 -0
- package/src/git/api/GithubError.ts +5 -0
- package/src/git/api/api.ts +180 -0
- package/src/git/api/index.ts +3 -0
- package/src/git/git.ts +8 -396
- package/src/git/index.ts +1 -0
- package/src/git/local/index.ts +1 -0
- package/src/git/local/local.ts +430 -0
- package/src/index.ts +17 -0
- package/src/printError.ts +189 -0
- package/src/sv.ts +321 -134
- package/src/versionUtil/__tests__/versionUtil.test.ts +62 -0
- package/src/versionUtil/index.ts +2 -0
- package/src/versionUtil/versionUtil.ts +103 -0
- package/tsconfig.json +1 -1
- package/dist/runner/handleErrors/handleBuildGraphError.d.ts +0 -1
- package/dist/runner/handleErrors/handleBuildGraphError.js +0 -42
- package/dist/runner/handleErrors/handleBuildGraphError.js.map +0 -1
- package/dist/runner/handleErrors/handleGitError.d.ts +0 -1
- package/dist/runner/handleErrors/handleGitError.js +0 -27
- package/dist/runner/handleErrors/handleGitError.js.map +0 -1
- package/dist/runner/handleErrors/handleInstallError.d.ts +0 -1
- package/dist/runner/handleErrors/handleInstallError.js +0 -30
- package/dist/runner/handleErrors/handleInstallError.js.map +0 -1
- package/dist/src/__tests__/versionUtil.test.d.ts +0 -1
- package/dist/src/__tests__/versionUtil.test.js +0 -80
- package/dist/src/__tests__/versionUtil.test.js.map +0 -1
- package/dist/src/buildGraph/GraphError.d.ts +0 -11
- package/dist/src/buildGraph/GraphError.js +0 -11
- package/dist/src/buildGraph/GraphError.js.map +0 -1
- package/dist/src/buildGraph/buildGraph.d.ts +0 -8
- package/dist/src/buildGraph/buildGraph.js +0 -100
- package/dist/src/buildGraph/buildGraph.js.map +0 -1
- package/dist/src/buildGraph/index.d.ts +0 -2
- package/dist/src/buildGraph/index.js +0 -8
- package/dist/src/buildGraph/index.js.map +0 -1
- package/dist/src/git/__tests__/parseGitUrl.test.d.ts +0 -1
- package/dist/src/git/__tests__/parseGitUrl.test.js +0 -30
- package/dist/src/git/__tests__/parseGitUrl.test.js.map +0 -1
- package/dist/src/versionUtil.d.ts +0 -13
- package/dist/src/versionUtil.js +0 -79
- package/dist/src/versionUtil.js.map +0 -1
- package/runner/handleErrors/handleBuildGraphError.ts +0 -49
- package/runner/handleErrors/handleGitError.ts +0 -28
- package/runner/handleErrors/handleInstallError.ts +0 -26
- package/src/__tests__/versionUtil.test.ts +0 -96
- package/src/buildGraph/GraphError.ts +0 -12
- package/src/buildGraph/buildGraph.ts +0 -150
- package/src/buildGraph/index.ts +0 -2
- package/src/versionUtil.ts +0 -97
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { GraphError } from '../../src/buildGraph';
|
|
2
|
-
import { log } from '../log';
|
|
3
|
-
import chalk from 'chalk';
|
|
4
|
-
|
|
5
|
-
export const handleBuildGraphError = (error: Error) => {
|
|
6
|
-
if (!(error instanceof GraphError)) return;
|
|
7
|
-
|
|
8
|
-
const { message: errorMessage, details } = error;
|
|
9
|
-
|
|
10
|
-
if (errorMessage === 'NOT_A_NPM') {
|
|
11
|
-
log.error('Not a npm project');
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
if (errorMessage === 'UNKNOWN_VERSION') {
|
|
15
|
-
const { name, version, parent } = details;
|
|
16
|
-
const stV = chalk.bgRed.bold.white(` ${version} `);
|
|
17
|
-
const stName = chalk.red.bold(name);
|
|
18
|
-
const stParent = chalk.green.bold(parent);
|
|
19
|
-
|
|
20
|
-
log.error('Unknown version', stV, 'for', stName, 'in', stParent);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
if (errorMessage === 'VERSION_CONFLICT') {
|
|
24
|
-
const { parents, name } = details;
|
|
25
|
-
|
|
26
|
-
const longestVersion = Object.values(parents ?? {}).reduce((len, v) => (
|
|
27
|
-
v.length > len ? v.length : len
|
|
28
|
-
), 0);
|
|
29
|
-
|
|
30
|
-
const formattedName = chalk.green.bold(name);
|
|
31
|
-
const baseMsg = `${chalk.red('Confilict')} for ${formattedName}:`;
|
|
32
|
-
|
|
33
|
-
const conflictMsg = Object.entries(parents ?? {})
|
|
34
|
-
.reduce((msg, [pName, v]) => {
|
|
35
|
-
const formatedV = chalk.bold.red(
|
|
36
|
-
String(v).padEnd(longestVersion, ' '),
|
|
37
|
-
);
|
|
38
|
-
|
|
39
|
-
return [
|
|
40
|
-
...msg,
|
|
41
|
-
` - Version ${formatedV} used in ${chalk.green.bold(pName)}`,
|
|
42
|
-
];
|
|
43
|
-
}, [baseMsg]);
|
|
44
|
-
|
|
45
|
-
log.error(conflictMsg.join('\n'));
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
log.error(errorMessage);
|
|
49
|
-
};
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { GitError } from '../../src/git';
|
|
2
|
-
import { log } from '../log';
|
|
3
|
-
|
|
4
|
-
export const handleGitError = (error: Error) => {
|
|
5
|
-
if (!(error instanceof GitError)) return;
|
|
6
|
-
|
|
7
|
-
const { message: errorMessage } = error;
|
|
8
|
-
|
|
9
|
-
if (errorMessage === 'GIT_NOT_A_REPO') {
|
|
10
|
-
log.error('Is not a git repo');
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
if (errorMessage === 'GIT_MODULE_CHECKOUT_FAILED') {
|
|
14
|
-
log.error('Checkout failded');
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
if (errorMessage === 'GIT_REPO_URL_REQUIRED') {
|
|
18
|
-
log.error('Module is not published yet - pass --repo-url for the first publish');
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
if (errorMessage === 'GIT_NOT_LATEST_VERSION') {
|
|
22
|
-
log.error('Publish is only possible from the latest version');
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
if (errorMessage === 'GIT_SYNC_CONFLICT') {
|
|
26
|
-
log.error('Sync with remote failed - resolve conflicts manually');
|
|
27
|
-
}
|
|
28
|
-
};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
import { versionUtil } from "../../src/versionUtil";
|
|
3
|
-
import { log } from '../log';
|
|
4
|
-
import { git } from '../../src/git';
|
|
5
|
-
|
|
6
|
-
export const handleInstallError = async (error: Error, gitUrl: string) => {
|
|
7
|
-
const { message } = error;
|
|
8
|
-
const { url, version, name } = git.parseUrl(gitUrl);
|
|
9
|
-
|
|
10
|
-
if (message === 'NOT_A_GIT_URL') {
|
|
11
|
-
return log.error(chalk.red.bold(url), '- is not a git url!');
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
if (message === 'REQUESTED_VERSION_NOT_EXISTS') {
|
|
15
|
-
const versions = await git.listVersions(name);
|
|
16
|
-
const latestVersion = versionUtil.latest(versions);
|
|
17
|
-
const requestedVersion = version || latestVersion;
|
|
18
|
-
const styledName = `Package ${chalk.bold.green(name)}`;
|
|
19
|
-
const styledVer = chalk.bgRed.bold.white(` ${requestedVersion} `);
|
|
20
|
-
const errMsg = `does not contain version ${styledVer}.`;
|
|
21
|
-
const styledVList = chalk.bold.green(versions.join(', '));
|
|
22
|
-
const helpMsg = `Use one from [${styledVList}]`;
|
|
23
|
-
|
|
24
|
-
return log.error(styledName, errMsg, helpMsg);
|
|
25
|
-
}
|
|
26
|
-
};
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { versionUtil } from '../versionUtil';
|
|
2
|
-
|
|
3
|
-
describe('Latest', () => {
|
|
4
|
-
it('Single version', () => {
|
|
5
|
-
const v = versionUtil.latest(['1.0.0']);
|
|
6
|
-
|
|
7
|
-
expect(v).toBe('1.0.0');
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
it('Path versions', () => {
|
|
11
|
-
const v = versionUtil.latest(['^1.0.0', '^1.0.1']);
|
|
12
|
-
|
|
13
|
-
expect(v).toBe('1.0.1');
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it('Minor versions', () => {
|
|
17
|
-
const v = versionUtil.latest(['^1.1.0', '^1.0.23']);
|
|
18
|
-
|
|
19
|
-
expect(v).toBe('1.1.0');
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it('Major versions', () => {
|
|
23
|
-
const v = versionUtil.latest(['^2.0.0', '^1.10.23']);
|
|
24
|
-
|
|
25
|
-
expect(v).toBe('2.0.0');
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
describe('Validate', () => {
|
|
30
|
-
it('Pass', () => {
|
|
31
|
-
expect(versionUtil.validate('')).toBe(false);
|
|
32
|
-
expect(versionUtil.validate('123')).toBe(false);
|
|
33
|
-
expect(versionUtil.validate('1.2.3')).toBe(true);
|
|
34
|
-
expect(versionUtil.validate('1.2.3', true)).toBe(true);
|
|
35
|
-
expect(versionUtil.validate('^1.2.3', true)).toBe(true);
|
|
36
|
-
expect(versionUtil.validate('^1.2.3')).toBe(false);
|
|
37
|
-
expect(versionUtil.validate('*')).toBe(false);
|
|
38
|
-
expect(versionUtil.validate('*', true)).toBe(true);
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
describe('Compare', () => {
|
|
43
|
-
it('Major mode', () => {
|
|
44
|
-
expect(versionUtil.compare([1, 2, 3], [1, 3, 4], 0)).toBe(true);
|
|
45
|
-
expect(versionUtil.compare([1, 3, 3], [1, 2, 4], 0)).toBe(false);
|
|
46
|
-
expect(versionUtil.compare([1, 2, 3], [1, 2, 4], 1)).toBe(true);
|
|
47
|
-
expect(versionUtil.compare([1, 2, 4], [1, 2, 3], 1)).toBe(false);
|
|
48
|
-
// Higher minor allows lower patch: 0.3.0 fits ^0.2.6
|
|
49
|
-
expect(versionUtil.compare([0, 2, 6], [0, 3, 0], 0)).toBe(true);
|
|
50
|
-
expect(versionUtil.compare([0, 2, 6], [0, 2, 5], 0)).toBe(false);
|
|
51
|
-
expect(versionUtil.compare([0, 2, 6], [0, 2, 6], 0)).toBe(true);
|
|
52
|
-
expect(versionUtil.compare([0, 2, 6], [1, 3, 0], 0)).toBe(false);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('Minor mode', () => {
|
|
56
|
-
expect(versionUtil.compare([1, 2, 3], [1, 2, 4], 1)).toBe(true);
|
|
57
|
-
expect(versionUtil.compare([1, 2, 4], [1, 2, 3], 1)).toBe(false);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
it('Path mode', () => {
|
|
61
|
-
expect(versionUtil.compare([1, 2, 3], [1, 2, 3], 2)).toBe(true);
|
|
62
|
-
expect(versionUtil.compare([1, 2, 4], [1, 2, 3], 2)).toBe(false);
|
|
63
|
-
expect(versionUtil.compare([1, 2, 3], [1, 2, 4], 2)).toBe(false);
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
describe('Pick', () => {
|
|
68
|
-
it('Caret range includes higher minors', () => {
|
|
69
|
-
const versions = ['0.2.5', '0.2.6', '0.2.8', '0.3.0', '1.0.0'];
|
|
70
|
-
|
|
71
|
-
expect(versionUtil.pick(versions, '^0.2.6')).toEqual(['0.2.6', '0.2.8', '0.3.0']);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it('Tilde range keeps minor pinned', () => {
|
|
75
|
-
const versions = ['1.2.3', '1.2.10', '1.3.0'];
|
|
76
|
-
|
|
77
|
-
expect(versionUtil.pick(versions, '~1.2.3')).toEqual(['1.2.3', '1.2.10']);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
describe('Bump', () => {
|
|
82
|
-
it('Release', () => {
|
|
83
|
-
expect(versionUtil.bump('0.0.0', 'release')).toBe('0.0.1');
|
|
84
|
-
expect(versionUtil.bump('1.2.3', 'release')).toBe('1.2.4');
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
it('Minor', () => {
|
|
88
|
-
expect(versionUtil.bump('0.0.0', 'minor')).toBe('0.1.0');
|
|
89
|
-
expect(versionUtil.bump('1.2.3', 'minor')).toBe('1.3.0');
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('Major', () => {
|
|
93
|
-
expect(versionUtil.bump('0.0.0', 'major')).toBe('1.0.0');
|
|
94
|
-
expect(versionUtil.bump('1.2.3', 'major')).toBe('2.0.0');
|
|
95
|
-
});
|
|
96
|
-
});
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { pkgJSONManager } from '../pkgJSONManager';
|
|
4
|
-
import { versionUtil } from '../versionUtil';
|
|
5
|
-
import { git } from '../git';
|
|
6
|
-
import { RunOptions } from '../runOptions';
|
|
7
|
-
import { GraphError } from './GraphError';
|
|
8
|
-
|
|
9
|
-
type TSV = Record<string, string>;
|
|
10
|
-
|
|
11
|
-
interface ITreeEntry {
|
|
12
|
-
meta: {
|
|
13
|
-
version: string;
|
|
14
|
-
sv: TSV;
|
|
15
|
-
};
|
|
16
|
-
parents: Record<string, string>;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
type TBaseTree = Record<string, ITreeEntry>;
|
|
20
|
-
|
|
21
|
-
export interface IGraphEntry {
|
|
22
|
-
versions: string[];
|
|
23
|
-
parents: Record<string, string>;
|
|
24
|
-
used: string[];
|
|
25
|
-
allowedVersions: string[];
|
|
26
|
-
version: string;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export const buildGraph = async (): Promise<Record<string, IGraphEntry>> => {
|
|
30
|
-
const baseJson = await pkgJSONManager.read();
|
|
31
|
-
const baseTree: TBaseTree = {};
|
|
32
|
-
|
|
33
|
-
if (!baseJson) {
|
|
34
|
-
throw new Error('NOT_A_NPM');
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
if (!baseJson.sv) {
|
|
38
|
-
/** There is no dependencies, graph is empty */
|
|
39
|
-
return {};
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const recursiveBuilder = async (dependencies: TSV = {}, parent = '*') => {
|
|
43
|
-
await Promise.all(
|
|
44
|
-
Object.entries(dependencies).map(async ([url, version]) => {
|
|
45
|
-
const { name } = git.parseUrl(url);
|
|
46
|
-
const { cwd, modulesDir } = RunOptions;
|
|
47
|
-
const moduleDir = path.join(cwd, modulesDir, name);
|
|
48
|
-
const isInstalled = fs.existsSync(moduleDir);
|
|
49
|
-
|
|
50
|
-
if (version && !versionUtil.validate(version, true)) {
|
|
51
|
-
throw new GraphError('UNKNOWN_VERSION', { name, version, parent });
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
if (!isInstalled) {
|
|
55
|
-
await git.addSumbmodule(url);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const existEntry = baseTree[name] || null;
|
|
59
|
-
|
|
60
|
-
const mJson = existEntry
|
|
61
|
-
? null
|
|
62
|
-
: await pkgJSONManager.read(name);
|
|
63
|
-
|
|
64
|
-
const meta = {
|
|
65
|
-
version: existEntry?.meta.version
|
|
66
|
-
|| mJson?.version
|
|
67
|
-
|| version
|
|
68
|
-
|| '*',
|
|
69
|
-
sv: existEntry?.meta.sv || mJson?.sv || {},
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
const parents = existEntry?.parents || {};
|
|
73
|
-
|
|
74
|
-
baseTree[name] = {
|
|
75
|
-
meta,
|
|
76
|
-
parents: { ...parents, [parent]: version },
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
await recursiveBuilder(meta.sv, name);
|
|
80
|
-
}),
|
|
81
|
-
);
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
await recursiveBuilder(baseJson.sv, baseJson.name);
|
|
85
|
-
|
|
86
|
-
const graph = await Promise.all(
|
|
87
|
-
Object.entries(baseTree).map(async ([name, data]) => {
|
|
88
|
-
const versions = await git.listVersions(name);
|
|
89
|
-
const { parents, meta } = data;
|
|
90
|
-
|
|
91
|
-
const used = Object.entries(parents).reduce((selective, [, v]) => (
|
|
92
|
-
versionUtil.pick(selective, v)
|
|
93
|
-
), versions);
|
|
94
|
-
|
|
95
|
-
const allowedVersions = Object.entries(parents)
|
|
96
|
-
.filter(([parent]) => parent !== baseJson.name)
|
|
97
|
-
.reduce((selective, [, v]) => (
|
|
98
|
-
versionUtil.pick(selective, v)
|
|
99
|
-
), versions);
|
|
100
|
-
|
|
101
|
-
// No compatible version found and module has version tags
|
|
102
|
-
if (!used.length && versions.length) {
|
|
103
|
-
throw new GraphError('VERSION_CONFLICT', { parents, name });
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Текущая версия — тег, на котором реально стоит HEAD. Сравнивать с
|
|
108
|
-
* package.json нельзя: его version не обязан совпадать с тегами,
|
|
109
|
-
* и такое сравнение отрывает HEAD (checkout на тег) при каждом buildGraph
|
|
110
|
-
* Checkout делаем только на чистой копии без локальной работы:
|
|
111
|
-
* незакоммиченные изменения или незапушенные коммиты
|
|
112
|
-
* важнее резолва версий.
|
|
113
|
-
*/
|
|
114
|
-
const current = await git.currentVersion(name);
|
|
115
|
-
|
|
116
|
-
if (!current || !used.includes(current)) {
|
|
117
|
-
const latest = versionUtil.latest(used);
|
|
118
|
-
|
|
119
|
-
const moduleDir = path.join(
|
|
120
|
-
RunOptions.cwd,
|
|
121
|
-
RunOptions.modulesDir,
|
|
122
|
-
name,
|
|
123
|
-
);
|
|
124
|
-
|
|
125
|
-
const [hasChanges, hasUnpushed] = await Promise.all([
|
|
126
|
-
git.hasChanges(moduleDir),
|
|
127
|
-
git.hasUnpushedCommits(moduleDir),
|
|
128
|
-
]);
|
|
129
|
-
|
|
130
|
-
const allChangesDone = !hasChanges && !hasUnpushed;
|
|
131
|
-
|
|
132
|
-
if (latest && latest !== current && allChangesDone) {
|
|
133
|
-
await git.checkout(name, latest);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
const version = current || meta.version;
|
|
138
|
-
|
|
139
|
-
return {
|
|
140
|
-
name,
|
|
141
|
-
data: { versions, parents, used, allowedVersions, version },
|
|
142
|
-
};
|
|
143
|
-
}),
|
|
144
|
-
);
|
|
145
|
-
|
|
146
|
-
return graph.reduce((acc, { name, data }) => ({
|
|
147
|
-
...acc,
|
|
148
|
-
[name]: data,
|
|
149
|
-
}), {} as Record<string, IGraphEntry>);
|
|
150
|
-
};
|
package/src/buildGraph/index.ts
DELETED
package/src/versionUtil.ts
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
enum ComapreMode {
|
|
2
|
-
major = 0,
|
|
3
|
-
minor = 1,
|
|
4
|
-
path = 2,
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
const cleanup = (v: string) => v.replace(/^\^?~?/, '');
|
|
8
|
-
|
|
9
|
-
const toArray = (v: string): number[] => (
|
|
10
|
-
cleanup(v).split('.').map(Number)
|
|
11
|
-
);
|
|
12
|
-
|
|
13
|
-
const mode = (v: string) => {
|
|
14
|
-
// Minor and path can be vary. Only major should be same
|
|
15
|
-
if (v.startsWith('^')) return ComapreMode.major;
|
|
16
|
-
// Path can be vary. Major and minor should be same
|
|
17
|
-
if (v.startsWith('~')) return ComapreMode.minor;
|
|
18
|
-
|
|
19
|
-
// Everything should be same
|
|
20
|
-
return ComapreMode.path;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
const compare = (
|
|
24
|
-
baseVer: number[],
|
|
25
|
-
actualVer: number[],
|
|
26
|
-
compareMode: ComapreMode,
|
|
27
|
-
) => {
|
|
28
|
-
// Components pinned by the mode must match exactly
|
|
29
|
-
for (let i = 0; i <= compareMode; i++) {
|
|
30
|
-
if (baseVer[i] !== actualVer[i]) return false;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// The rest must be same or higher, compared from most significant:
|
|
34
|
-
// a higher minor allows any patch (0.3.0 fits ^0.2.6)
|
|
35
|
-
for (let i = compareMode + 1; i < 3; i++) {
|
|
36
|
-
if (actualVer[i] !== baseVer[i]) return actualVer[i] > baseVer[i];
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return true;
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const pick = (allVersions: string[], v: string) => {
|
|
43
|
-
if (v === '*') return allVersions;
|
|
44
|
-
|
|
45
|
-
const vMode = mode(v);
|
|
46
|
-
const vArr = toArray(v);
|
|
47
|
-
|
|
48
|
-
return allVersions.filter(av => {
|
|
49
|
-
const avArr = toArray(av);
|
|
50
|
-
|
|
51
|
-
return compare(vArr, avArr, vMode);
|
|
52
|
-
});
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
const validate = (v: string, relative?: boolean) => {
|
|
56
|
-
if (relative) {
|
|
57
|
-
if (v === '*') return true;
|
|
58
|
-
|
|
59
|
-
return /^[\^$]?\d+\.\d+\.\d+$/.test(v);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
return /^\d+\.\d+\.\d+$/.test(v);
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
const latest = (versions: string[]) => (
|
|
66
|
-
cleanup([...versions].sort((v1, v2) => {
|
|
67
|
-
const v1Arr = toArray(v1);
|
|
68
|
-
const v2Arr = toArray(v2);
|
|
69
|
-
|
|
70
|
-
return v1Arr.reduce((acc, v1Val, i) => {
|
|
71
|
-
if (acc !== 0) return acc;
|
|
72
|
-
const v2Val = v2Arr[i];
|
|
73
|
-
|
|
74
|
-
return v2Val - v1Val;
|
|
75
|
-
}, 0);
|
|
76
|
-
})[0] || '')
|
|
77
|
-
);
|
|
78
|
-
|
|
79
|
-
const bump = (
|
|
80
|
-
version: string,
|
|
81
|
-
kind: 'release' | 'minor' | 'major',
|
|
82
|
-
): string => {
|
|
83
|
-
const [major, minor, patch] = toArray(version);
|
|
84
|
-
|
|
85
|
-
if (kind === 'major') return `${major + 1}.0.0`;
|
|
86
|
-
if (kind === 'minor') return `${major}.${minor + 1}.0`;
|
|
87
|
-
|
|
88
|
-
return `${major}.${minor}.${patch + 1}`;
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
export const versionUtil = {
|
|
92
|
-
compare,
|
|
93
|
-
pick,
|
|
94
|
-
validate,
|
|
95
|
-
latest,
|
|
96
|
-
bump,
|
|
97
|
-
};
|