submodule-version 2.0.4 → 2.1.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.
Files changed (100) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/index.js +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/src/Graph/Graph.d.ts +12 -0
  5. package/dist/src/Graph/Graph.js +85 -0
  6. package/dist/src/Graph/Graph.js.map +1 -0
  7. package/dist/src/Graph/GraphError.d.ts +11 -0
  8. package/dist/src/Graph/GraphError.js +11 -0
  9. package/dist/src/Graph/GraphError.js.map +1 -0
  10. package/dist/src/Graph/index.d.ts +2 -0
  11. package/dist/src/Graph/index.js +8 -0
  12. package/dist/src/Graph/index.js.map +1 -0
  13. package/dist/src/PkgJSONManager.d.ts +6 -0
  14. package/dist/src/PkgJSONManager.js +53 -0
  15. package/dist/src/PkgJSONManager.js.map +1 -0
  16. package/dist/src/git/__tests__/parseGitUrl.test.js.map +1 -0
  17. package/dist/src/git/git.d.ts +6 -0
  18. package/dist/src/git/git.js +53 -0
  19. package/dist/src/git/git.js.map +1 -0
  20. package/dist/src/git/index.d.ts +1 -0
  21. package/dist/src/git/index.js +6 -0
  22. package/dist/src/git/index.js.map +1 -0
  23. package/dist/src/{parseGitUrl.d.ts → git/parseGitUrl.d.ts} +1 -2
  24. package/dist/src/git/parseGitUrl.js.map +1 -0
  25. package/dist/src/index.d.ts +1 -0
  26. package/dist/src/index.js +6 -0
  27. package/dist/src/index.js.map +1 -0
  28. package/dist/src/runOptions.d.ts +4 -0
  29. package/dist/src/runOptions.js +9 -0
  30. package/dist/src/runOptions.js.map +1 -0
  31. package/dist/src/runner/handleErrors/handleBuildGraphError.d.ts +1 -0
  32. package/dist/src/runner/handleErrors/handleBuildGraphError.js +42 -0
  33. package/dist/src/runner/handleErrors/handleBuildGraphError.js.map +1 -0
  34. package/dist/src/runner/handleErrors/handleErrors.d.ts +1 -0
  35. package/dist/src/runner/handleErrors/handleErrors.js +13 -0
  36. package/dist/src/runner/handleErrors/handleErrors.js.map +1 -0
  37. package/dist/src/runner/handleErrors/handleInstallError.d.ts +1 -0
  38. package/dist/src/runner/handleErrors/handleInstallError.js +30 -0
  39. package/dist/src/runner/handleErrors/handleInstallError.js.map +1 -0
  40. package/dist/src/runner/handleErrors/index.d.ts +1 -0
  41. package/dist/src/runner/handleErrors/index.js +6 -0
  42. package/dist/src/runner/handleErrors/index.js.map +1 -0
  43. package/dist/src/runner/index.d.ts +1 -0
  44. package/dist/src/runner/index.js +4 -0
  45. package/dist/src/runner/index.js.map +1 -0
  46. package/dist/src/runner/runer.js +54 -0
  47. package/dist/src/runner/runer.js.map +1 -0
  48. package/dist/src/sv.d.ts +8 -0
  49. package/dist/src/sv.js +55 -0
  50. package/dist/src/sv.js.map +1 -0
  51. package/dist/src/versionUtil.js.map +1 -1
  52. package/index-dev.ts +1 -1
  53. package/index.ts +1 -1
  54. package/package.json +3 -2
  55. package/src/Graph/Graph.ts +121 -0
  56. package/src/Graph/GraphError.ts +12 -0
  57. package/src/Graph/index.ts +2 -0
  58. package/src/PkgJSONManager.ts +57 -0
  59. package/src/git/git.ts +64 -0
  60. package/src/git/index.ts +1 -0
  61. package/src/{parseGitUrl.ts → git/parseGitUrl.ts} +1 -1
  62. package/src/index.ts +1 -0
  63. package/src/runOptions.ts +4 -0
  64. package/src/runner/handleErrors/handleBuildGraphError.ts +49 -0
  65. package/src/runner/handleErrors/handleErrors.ts +9 -0
  66. package/src/runner/handleErrors/handleInstallError.ts +26 -0
  67. package/src/runner/handleErrors/index.ts +1 -0
  68. package/src/runner/index.ts +1 -0
  69. package/src/runner/runer.ts +76 -0
  70. package/src/sv.ts +67 -0
  71. package/dist/src/__tests__/parseGitUrl.test.js.map +0 -1
  72. package/dist/src/buildGraph.d.ts +0 -7
  73. package/dist/src/buildGraph.js +0 -88
  74. package/dist/src/buildGraph.js.map +0 -1
  75. package/dist/src/config.d.ts +0 -4
  76. package/dist/src/config.js +0 -8
  77. package/dist/src/config.js.map +0 -1
  78. package/dist/src/git.d.ts +0 -5
  79. package/dist/src/git.js +0 -55
  80. package/dist/src/git.js.map +0 -1
  81. package/dist/src/install.d.ts +0 -1
  82. package/dist/src/install.js +0 -43
  83. package/dist/src/install.js.map +0 -1
  84. package/dist/src/parseGitUrl.js.map +0 -1
  85. package/dist/src/pkgJsonUtil.d.ts +0 -5
  86. package/dist/src/pkgJsonUtil.js +0 -38
  87. package/dist/src/pkgJsonUtil.js.map +0 -1
  88. package/dist/src/submoduleVersion.js +0 -43
  89. package/dist/src/submoduleVersion.js.map +0 -1
  90. package/src/buildGraph.ts +0 -126
  91. package/src/config.ts +0 -4
  92. package/src/git.ts +0 -52
  93. package/src/install.ts +0 -47
  94. package/src/pkgJsonUtil.ts +0 -36
  95. package/src/submoduleVersion.ts +0 -54
  96. /package/dist/src/{__tests__ → git/__tests__}/parseGitUrl.test.d.ts +0 -0
  97. /package/dist/src/{__tests__ → git/__tests__}/parseGitUrl.test.js +0 -0
  98. /package/dist/src/{parseGitUrl.js → git/parseGitUrl.js} +0 -0
  99. /package/dist/src/{submoduleVersion.d.ts → runner/runer.d.ts} +0 -0
  100. /package/src/{__tests__ → git/__tests__}/parseGitUrl.test.ts +0 -0
package/dist/src/sv.js ADDED
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SV = void 0;
4
+ const PkgJSONManager_1 = require("./PkgJSONManager");
5
+ const Graph_1 = require("./Graph");
6
+ const runOptions_1 = require("./runOptions");
7
+ const versionUtil_1 = require("./versionUtil");
8
+ const git_1 = require("./git");
9
+ class SV {
10
+ constructor(projectDir, modulesDir = 'addons') {
11
+ this.buildGraph = () => this.graph.build();
12
+ this.install = async (gitUrl, parentModule) => {
13
+ const { url, version, name } = git_1.git.parseUrl(gitUrl);
14
+ if (!name) {
15
+ throw new Error('NOT_A_GIT_URL');
16
+ }
17
+ const targetPkg = await this.pkgJSONManager.read(parentModule);
18
+ let installedPkg = await this.pkgJSONManager.read(name);
19
+ if (!installedPkg) {
20
+ await git_1.git.addSumbmodule(url);
21
+ installedPkg = this.pkgJSONManager.read(name);
22
+ }
23
+ const versions = await git_1.git.listVersions(name);
24
+ const latestVersion = versionUtil_1.versionUtil.latest(versions);
25
+ const requestedVersion = version || latestVersion;
26
+ if (!versions.includes(requestedVersion) && versions.length) {
27
+ throw new Error('REQUESTED_VERSION_NOT_EXISTS');
28
+ }
29
+ if (!targetPkg.sv) {
30
+ targetPkg.sv = {};
31
+ }
32
+ targetPkg.sv[url] = requestedVersion ? `^${requestedVersion}` : '*';
33
+ await this.pkgJSONManager.write(targetPkg, parentModule);
34
+ await this.graph.build();
35
+ };
36
+ this.update = async () => {
37
+ const graph = await this.graph.build();
38
+ if (!graph)
39
+ return;
40
+ await Promise.all(Object.entries(graph).map(async ([name, data]) => {
41
+ const { version, used } = data;
42
+ const latestVersion = versionUtil_1.versionUtil.latest(used);
43
+ if (latestVersion !== version) {
44
+ await git_1.git.checkout(name, latestVersion);
45
+ }
46
+ }));
47
+ };
48
+ runOptions_1.RunOptions.cwd = projectDir;
49
+ runOptions_1.RunOptions.modulesDir = modulesDir;
50
+ this.pkgJSONManager = new PkgJSONManager_1.PkgJSONManager();
51
+ this.graph = new Graph_1.Graph(this.pkgJSONManager);
52
+ }
53
+ }
54
+ exports.SV = SV;
55
+ //# sourceMappingURL=sv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sv.js","sourceRoot":"","sources":["../../src/sv.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"versionUtil.js","sourceRoot":"","sources":["../../src/versionUtil.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"versionUtil.js","sourceRoot":"","sources":["../../src/versionUtil.ts"],"names":[],"mappings":"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"}
package/index-dev.ts CHANGED
@@ -4,4 +4,4 @@ import chalk from 'chalk';
4
4
  import { log } from './src/log';
5
5
 
6
6
  log.message(chalk.bgRed.white.bold(' RUNNED IN DEV MODE '));
7
- import './src/submoduleVersion';
7
+ import './src/runner';
package/index.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import './src/submoduleVersion';
3
+ import './src/runner';
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "submodule-version",
3
3
  "description": "Git <S>ubmodule <V>ersioning tool",
4
- "version": "2.0.4",
4
+ "version": "2.1.0",
5
5
  "repository": "github:guljeny/submodule-version",
6
+ "main": "dist/src/index.js",
6
7
  "bin": {
7
8
  "sv": "dist/index.js",
8
9
  "sv-dev": "index-dev.ts"
@@ -10,7 +11,7 @@
10
11
  "scripts": {
11
12
  "prepare": "npm run build",
12
13
  "test": "npx jest",
13
- "build": "npx tsc",
14
+ "build": "rm -rf ./dist && npx tsc",
14
15
  "lint": "npx eslint ./src"
15
16
  },
16
17
  "author": "Yauheni Hul",
@@ -0,0 +1,121 @@
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
+ version: string;
26
+ }
27
+
28
+ export class Graph {
29
+ constructor (private pkgJSONManager: PkgJSONManager) {}
30
+
31
+ public async build (): Promise<Record<string, IGraphEntry>> {
32
+ const baseJson = await this.pkgJSONManager.read();
33
+ const baseTree: TBaseTree = {};
34
+
35
+ if (!baseJson) {
36
+ throw new Error('NOT_A_NPM');
37
+ }
38
+
39
+ if (!baseJson.sv) {
40
+ /** There is no dependencies, graph is empty */
41
+ return {};
42
+ }
43
+
44
+ const recursiveBuilder = async (dependencies: TSV = {}, parent = '*') => {
45
+ await Promise.all(
46
+ Object.entries(dependencies).map(async ([url, version]) => {
47
+ const { name } = git.parseUrl(url);
48
+ const { cwd, modulesDir } = RunOptions;
49
+ const moduleDir = path.join(cwd, modulesDir, name);
50
+ const isInstalled = fs.existsSync(moduleDir);
51
+
52
+ if (version && !versionUtil.validate(version, true)) {
53
+ throw new GraphError('UNKNOWN_VERSION', { name, version, parent });
54
+ }
55
+
56
+ if (!isInstalled) {
57
+ await git.addSumbmodule(url);
58
+ }
59
+
60
+ const existEntry = baseTree[name] || null;
61
+
62
+ const mJson = existEntry
63
+ ? null
64
+ : await this.pkgJSONManager.read(name);
65
+
66
+ const meta = {
67
+ version: existEntry?.meta.version
68
+ || mJson?.version
69
+ || version
70
+ || '*',
71
+ sv: existEntry?.meta.sv || mJson?.sv || {},
72
+ };
73
+
74
+ const parents = existEntry?.parents || {};
75
+
76
+ baseTree[name] = {
77
+ meta,
78
+ parents: { ...parents, [parent]: version },
79
+ };
80
+
81
+ await recursiveBuilder(meta.sv, name);
82
+ }),
83
+ );
84
+ };
85
+
86
+ await recursiveBuilder(baseJson.sv, baseJson.name);
87
+
88
+ const graph = await Promise.all(
89
+ Object.entries(baseTree).map(async ([name, data]) => {
90
+ const versions = await git.listVersions(name);
91
+ const { parents, meta } = data;
92
+
93
+ const used = Object.entries(parents).reduce((selective, [, v]) => (
94
+ versionUtil.pick(selective, v)
95
+ ), versions);
96
+
97
+ // No compatible version found and module has version tags
98
+ if (!used.length && versions.length) {
99
+ throw new GraphError('VERSION_CONFLICT', { parents, name });
100
+ }
101
+
102
+ if (!used.includes(meta.version)) {
103
+ const latest = versionUtil.latest(used);
104
+ if (latest) {
105
+ await git.checkout(name, latest);
106
+ }
107
+ }
108
+
109
+ return {
110
+ name,
111
+ data: { versions, parents, used, version: meta.version },
112
+ };
113
+ }),
114
+ );
115
+
116
+ return graph.reduce((acc, { name, data }) => ({
117
+ ...acc,
118
+ [name]: data,
119
+ }), {} as Record<string, IGraphEntry>);
120
+ }
121
+ }
@@ -0,0 +1,12 @@
1
+ type TDetails = {
2
+ name: string;
3
+ parents?: Record<string, string>;
4
+ version?: string;
5
+ parent?: string;
6
+ }
7
+
8
+ export class GraphError extends Error {
9
+ constructor (type: string, public details: TDetails) {
10
+ super(type);
11
+ }
12
+ }
@@ -0,0 +1,2 @@
1
+ export { Graph } from './Graph';
2
+ export { GraphError } from './GraphError';
@@ -0,0 +1,57 @@
1
+ import fs from 'fs';
2
+ import { promisify } from 'util';
3
+ import path from 'path';
4
+ import { RunOptions } from './runOptions';
5
+
6
+ const existsAsync = promisify(fs.exists);
7
+ const readFileAsync = promisify(fs.readFile);
8
+ const writeFileAsync = promisify(fs.writeFile);
9
+ const JSON_NAME = 'package.json';
10
+
11
+ type TJSONPath = string | null;
12
+
13
+ const getJsonPath = async (submoduleName?: string): Promise<TJSONPath> => {
14
+ const folder = submoduleName ? [RunOptions.modulesDir, submoduleName] : [];
15
+ const jsonPath = path.join(RunOptions.cwd, ...folder, JSON_NAME);
16
+ const isJsonExists = await existsAsync(jsonPath);
17
+ if (!isJsonExists) return null;
18
+
19
+ return jsonPath;
20
+ };
21
+
22
+ export class PkgJSONManager {
23
+ private cache: Map<string, any> = new Map();
24
+
25
+ /* Reads package.json in project folder or in submodule */
26
+ public read = async (submoduleName?: string) => {
27
+ const jsonPath = await getJsonPath(submoduleName);
28
+
29
+ if (!jsonPath) return null;
30
+
31
+ if (this.cache.has(jsonPath)) {
32
+ return this.cache.get(jsonPath);
33
+ }
34
+
35
+ const jsonString = await readFileAsync(jsonPath, 'utf-8');
36
+ const parsed = JSON.parse(jsonString);
37
+
38
+ this.cache.set(jsonPath, parsed);
39
+
40
+ return parsed;
41
+ };
42
+
43
+ /* Writes package.json in project folder or in submodule */
44
+ public write = async (data: Object, submoduleName?: string) => {
45
+ const jsonPath = await getJsonPath(submoduleName);
46
+
47
+ if (!jsonPath) return;
48
+
49
+ this.cache.set(jsonPath, data);
50
+
51
+ await writeFileAsync(jsonPath, JSON.stringify(data, null, 2));
52
+ };
53
+
54
+ public clearCache (): void {
55
+ this.cache.clear();
56
+ }
57
+ }
package/src/git/git.ts ADDED
@@ -0,0 +1,64 @@
1
+ import chalk from 'chalk';
2
+ import { exec } from 'child_process';
3
+ import { promisify } from 'util';
4
+ import path from 'path';
5
+ import { log } from '../log';
6
+ import { parseGitUrl } from './parseGitUrl';
7
+ import { versionUtil } from '../versionUtil';
8
+ import { RunOptions } from '../runOptions';
9
+
10
+ const execAsync = promisify(exec);
11
+
12
+ export const git = {
13
+ parseUrl: parseGitUrl,
14
+
15
+ addSumbmodule: async (url: string): Promise<void> => {
16
+ const { name } = parseGitUrl(url);
17
+ const module = path.join(RunOptions.modulesDir, name);
18
+
19
+ // try {
20
+ await execAsync(
21
+ `git submodule add ${url} ${module}`,
22
+ { cwd: RunOptions.cwd },
23
+ );
24
+ // } catch {
25
+ // log.error(url, 'Is not a git repo', RunOptions.cwd);
26
+ // }
27
+ },
28
+
29
+ checkout: async (name: string, version: string): Promise<void> => {
30
+ const module = path.join(RunOptions.modulesDir, name);
31
+ const styledName = chalk.green.bold(name);
32
+ const styledVer = chalk.green.bold(version);
33
+
34
+ try {
35
+ log.message('Checkout', styledName, 'to', styledVer);
36
+ await execAsync(
37
+ `git -C ${module} checkout ${version} -q`,
38
+ { cwd: RunOptions.cwd },
39
+ );
40
+ } catch {
41
+ log.error('Checkout failded');
42
+ }
43
+ },
44
+
45
+ listVersions: async (projectName: string): Promise<string[]> => {
46
+ const module = path.join(RunOptions.modulesDir, projectName);
47
+ const styledName = chalk.green.bold(projectName);
48
+ log.message('Fetching tag list for', styledName);
49
+ await execAsync(`git -C ${module} fetch --tags`, { cwd: RunOptions.cwd });
50
+
51
+ const res = await execAsync(
52
+ `git -C ${module} tag -l`,
53
+ { cwd: RunOptions.cwd },
54
+ );
55
+
56
+ const tagList = res.stdout.toString().split(/\r?\n/);
57
+
58
+ return tagList.filter(tag => {
59
+ if (!tag) return false;
60
+
61
+ return versionUtil.validate(tag);
62
+ });
63
+ },
64
+ };
@@ -0,0 +1 @@
1
+ export { git } from './git';
@@ -1,4 +1,4 @@
1
- interface IParseResult {
1
+ export interface IParseResult {
2
2
  name: string;
3
3
  url: string;
4
4
  version: string | null;
package/src/index.ts ADDED
@@ -0,0 +1 @@
1
+ export { SV } from './sv';
@@ -0,0 +1,4 @@
1
+ export class RunOptions {
2
+ public static cwd: string = '';
3
+ public static modulesDir: string = '';
4
+ }
@@ -0,0 +1,49 @@
1
+ import { GraphError } from '../../Graph';
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
+ };
@@ -0,0 +1,9 @@
1
+ import { handleBuildGraphError } from './handleBuildGraphError';
2
+ import { handleInstallError } from './handleInstallError';
3
+
4
+ export const handleErrors = async (error: Error, gitUrl: string) => {
5
+ await Promise.all([
6
+ handleBuildGraphError(error),
7
+ handleInstallError(error, gitUrl),
8
+ ]);
9
+ };
@@ -0,0 +1,26 @@
1
+ import chalk from 'chalk';
2
+ import { versionUtil } from "../../versionUtil";
3
+ import { log } from '../../log';
4
+ import { git } from '../../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
+ };
@@ -0,0 +1 @@
1
+ export { handleErrors } from './handleErrors';
@@ -0,0 +1 @@
1
+ import './runer';
@@ -0,0 +1,76 @@
1
+ import chalk from 'chalk';
2
+ import yargs from 'yargs';
3
+ import { SV } from '../sv';
4
+ import { log } from '../log';
5
+ import { handleErrors } from './handleErrors';
6
+
7
+ const BASE_DIR = 'modules';
8
+
9
+ const makeEvent = (event: (sv: SV, arg: any) => Promise<void>) => {
10
+ const sv = new SV(process.cwd(), BASE_DIR);
11
+
12
+ return async (arg: any) => {
13
+ const { url: gitUrl } = arg as {url: string};
14
+
15
+ try {
16
+ await event(sv, arg);
17
+ } catch (e) {
18
+ handleErrors(e as Error, gitUrl);
19
+ }
20
+ };
21
+ };
22
+
23
+ const install = makeEvent(async (sv, arg) => {
24
+ const { url: gitUrl, target } = arg as {url: string, target?: string};
25
+ await sv.install(gitUrl, target);
26
+ });
27
+
28
+ const update = makeEvent(async sv => {
29
+ await sv.update();
30
+ });
31
+
32
+ const validate = makeEvent(async sv => {
33
+ const result = await sv.buildGraph();
34
+
35
+ Object.entries(result).forEach(([name, entry]) => {
36
+ if (!entry.used.includes(entry.version) && entry.versions.length === 0) {
37
+ log.message(
38
+ chalk.yellow('⚠️ WARN: Module'),
39
+ chalk.bgYellow.black(` ${name} `),
40
+ chalk.yellow('does not contain any version tag!'),
41
+ );
42
+ }
43
+ });
44
+
45
+ log.message(chalk.green.bold('Everything is up to date!🔥'));
46
+ });
47
+
48
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
49
+ yargs.scriptName('sv')
50
+ .usage('$0 <cmd> [args]')
51
+ .command(
52
+ ['validate', '$0', 'v'],
53
+ 'Validate and install modules',
54
+ () => {},
55
+ validate,
56
+ )
57
+ .command(
58
+ ['update', 'u'],
59
+ 'Update git modules to actual versions',
60
+ () => {},
61
+ update,
62
+ )
63
+ .command(
64
+ ['install <url> [target]', 'i'],
65
+ 'Install new submodule',
66
+ y => y.positional('url', {
67
+ type: 'string',
68
+ describe: 'Git submodule url',
69
+ }).positional('target', {
70
+ type: 'string',
71
+ describe: 'Target module name',
72
+ }),
73
+ install,
74
+ )
75
+ .help()
76
+ .argv;
package/src/sv.ts ADDED
@@ -0,0 +1,67 @@
1
+ import { PkgJSONManager } from "./PkgJSONManager";
2
+ import { Graph } from "./Graph";
3
+ import { RunOptions } from "./runOptions";
4
+ import { versionUtil } from "./versionUtil";
5
+ import { git } from "./git";
6
+
7
+ export class SV {
8
+ private pkgJSONManager: PkgJSONManager;
9
+ private graph: Graph;
10
+
11
+ constructor (
12
+ projectDir: string,
13
+ modulesDir: string = 'addons',
14
+ ) {
15
+ RunOptions.cwd = projectDir;
16
+ RunOptions.modulesDir = modulesDir;
17
+
18
+ this.pkgJSONManager = new PkgJSONManager();
19
+ this.graph = new Graph(this.pkgJSONManager);
20
+ }
21
+
22
+ public buildGraph = () => this.graph.build();
23
+
24
+ public install = async (gitUrl: string, parentModule?: string) => {
25
+ const { url, version, name } = git.parseUrl(gitUrl);
26
+
27
+ if (!name) {
28
+ throw new Error('NOT_A_GIT_URL');
29
+ }
30
+
31
+ const targetPkg = await this.pkgJSONManager.read(parentModule);
32
+ let installedPkg = await this.pkgJSONManager.read(name);
33
+
34
+ if (!installedPkg) {
35
+ await git.addSumbmodule(url);
36
+ installedPkg = this.pkgJSONManager.read(name);
37
+ }
38
+
39
+ const versions = await git.listVersions(name);
40
+ const latestVersion = versionUtil.latest(versions);
41
+ const requestedVersion = version || latestVersion;
42
+
43
+ if (!versions.includes(requestedVersion) && versions.length) {
44
+ throw new Error('REQUESTED_VERSION_NOT_EXISTS');
45
+ }
46
+
47
+ if (!targetPkg.sv) {
48
+ targetPkg.sv = {};
49
+ }
50
+
51
+ targetPkg.sv[url] = requestedVersion ? `^${requestedVersion}` : '*';
52
+ await this.pkgJSONManager.write(targetPkg, parentModule);
53
+ await this.graph.build();
54
+ };
55
+
56
+ public update = async () => {
57
+ const graph = await this.graph.build();
58
+ if (!graph) return;
59
+ await Promise.all(Object.entries(graph).map(async ([name, data]) => {
60
+ const { version, used } = data;
61
+ const latestVersion = versionUtil.latest(used);
62
+ if (latestVersion !== version) {
63
+ await git.checkout(name, latestVersion);
64
+ }
65
+ }));
66
+ };
67
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"parseGitUrl.test.js","sourceRoot":"","sources":["../../../src/__tests__/parseGitUrl.test.ts"],"names":[],"mappings":";;AAAA,gDAA6C;AAE7C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QACzB,MAAM,GAAG,GAAG,8CAA8C,CAAC;QAE3D,MAAM,CAAC,IAAA,yBAAW,EAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YAC/B,GAAG,EAAE,8CAA8C;YACnD,OAAO,EAAE,SAAS;YAClB,IAAI,EAAE,aAAa;SACpB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;QACtB,MAAM,GAAG,GAAG,oDAAoD,CAAC;QAEjE,MAAM,CAAC,IAAA,yBAAW,EAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YAC/B,GAAG,EAAE,8CAA8C;YACnD,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,aAAa;SACpB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;QACtB,MAAM,GAAG,GAAG,aAAa,CAAC;QAE1B,MAAM,CAAC,IAAA,yBAAW,EAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YAC/B,GAAG,EAAE,aAAa;YAClB,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,EAAE;SACT,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,7 +0,0 @@
1
- export interface IGraphEntry {
2
- versions: string[];
3
- parents: Record<string, string>;
4
- used: string[];
5
- version: string;
6
- }
7
- export declare const buildGraph: () => Record<string, IGraphEntry> | void;