@stack-spot/build-tools 1.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.
- package/CHANGELOG.md +8 -0
- package/dist/package-override.d.ts +2 -0
- package/dist/package-override.d.ts.map +1 -0
- package/dist/package-override.js +107 -0
- package/dist/package-override.js.map +1 -0
- package/package.json +27 -0
- package/src/package-override.ts +106 -0
- package/tsconfig.json +9 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [1.1.0](https://github.com/stack-spot/portal-commons/compare/build-tools@v1.0.0...build-tools@v1.1.0) (2026-01-13)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* build tools ([#1987](https://github.com/stack-spot/portal-commons/issues/1987)) ([a4d63d6](https://github.com/stack-spot/portal-commons/commit/a4d63d6fbf9967d8d76a669565ca0177b5498fd5))
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-override.d.ts","sourceRoot":"","sources":["../src/package-override.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
import { exec } from 'child_process';
|
|
3
|
+
import { access, constants, readFile, writeFile } from 'fs/promises';
|
|
4
|
+
const variables = {
|
|
5
|
+
timestamp: () => new Date().getTime(),
|
|
6
|
+
};
|
|
7
|
+
function merge(a, b) {
|
|
8
|
+
if (a === null || typeof a !== 'object')
|
|
9
|
+
return b;
|
|
10
|
+
if (Array.isArray(a) && Array.isArray(b))
|
|
11
|
+
return [...a, ...b];
|
|
12
|
+
const result = { ...a };
|
|
13
|
+
for (const key in b) {
|
|
14
|
+
if (typeof b === 'object')
|
|
15
|
+
result[key] = merge(result[key], b[key]);
|
|
16
|
+
else
|
|
17
|
+
result[key] = b[key];
|
|
18
|
+
}
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
function replaceVariables(data) {
|
|
22
|
+
if (typeof data === 'string') {
|
|
23
|
+
return data.replace(/\{([\w_]+)\}/g, (match, varname) => varname in variables ? `${variables[varname]()}` : match);
|
|
24
|
+
}
|
|
25
|
+
if (Array.isArray(data)) {
|
|
26
|
+
return data.map(replaceVariables);
|
|
27
|
+
}
|
|
28
|
+
if (data && typeof data === 'object') {
|
|
29
|
+
const result = {};
|
|
30
|
+
for (const key in data) {
|
|
31
|
+
result[key] = replaceVariables(data[key]);
|
|
32
|
+
}
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
return data;
|
|
36
|
+
}
|
|
37
|
+
async function isEnvValid(env) {
|
|
38
|
+
if (!env)
|
|
39
|
+
return false;
|
|
40
|
+
try {
|
|
41
|
+
await access(`package.${env}.json`, constants.F_OK);
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function readPackage(suffix) {
|
|
49
|
+
const packageString = await readFile(`package${suffix ? `.${suffix}` : ''}.json`, { encoding: 'utf-8' });
|
|
50
|
+
return [JSON.parse(packageString), packageString];
|
|
51
|
+
}
|
|
52
|
+
async function getEnv() {
|
|
53
|
+
const fromCmd = process.argv.join(' ').match(/--env=(\w+)/)?.[1];
|
|
54
|
+
if (fromCmd)
|
|
55
|
+
return fromCmd.trim();
|
|
56
|
+
try {
|
|
57
|
+
const fromBranchName = await asyncExec('git rev-parse --abbrev-ref HEAD');
|
|
58
|
+
return fromBranchName.trim();
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function getShouldRevert() {
|
|
65
|
+
return !/--revert=false/.test(process.argv.join(' '));
|
|
66
|
+
}
|
|
67
|
+
async function prepare(env) {
|
|
68
|
+
const [pckg, originalPckg] = await readPackage();
|
|
69
|
+
const [envPckg] = await readPackage(env);
|
|
70
|
+
const resultingPackage = replaceVariables(merge(pckg, envPckg));
|
|
71
|
+
await writeFile('package.json', JSON.stringify(resultingPackage, null, 2), { encoding: 'utf-8' });
|
|
72
|
+
return [originalPckg, resultingPackage];
|
|
73
|
+
}
|
|
74
|
+
function asyncExec(cmd, cwd) {
|
|
75
|
+
return new Promise((resolve, reject) => {
|
|
76
|
+
exec(cmd, { cwd }, (error, stdout, stderr) => {
|
|
77
|
+
if (error)
|
|
78
|
+
reject(`${error.message}\n\n${stdout}\n\n${stderr}`);
|
|
79
|
+
else
|
|
80
|
+
resolve(stdout);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
async function revert(packageBackup) {
|
|
85
|
+
await writeFile('package.json', packageBackup, { encoding: 'utf-8' });
|
|
86
|
+
}
|
|
87
|
+
async function start() {
|
|
88
|
+
const env = await getEnv();
|
|
89
|
+
if (!(await isEnvValid(env))) {
|
|
90
|
+
console.log('No overrides set for environment:', env);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const shouldRevert = getShouldRevert();
|
|
94
|
+
console.log(`Overriding dependencies for ${env}...`);
|
|
95
|
+
const [packageBackup] = await prepare(env ?? '');
|
|
96
|
+
try {
|
|
97
|
+
console.log('Installing overridden dependencies...');
|
|
98
|
+
await asyncExec('pnpm i');
|
|
99
|
+
console.log('Done.');
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
if (shouldRevert)
|
|
103
|
+
await revert(packageBackup);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
start();
|
|
107
|
+
//# sourceMappingURL=package-override.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-override.js","sourceRoot":"","sources":["../src/package-override.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@stack-spot/build-tools",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"bin": {
|
|
6
|
+
"package-override": "./dist/package-override.js"
|
|
7
|
+
},
|
|
8
|
+
"devDependencies": {
|
|
9
|
+
"@types/node": "^22.14.1",
|
|
10
|
+
"eslint": "^8.53.0",
|
|
11
|
+
"eslint-plugin-filenames": "^1.3.2",
|
|
12
|
+
"eslint-plugin-import": "^2.29.0",
|
|
13
|
+
"eslint-plugin-lodash": "^7.4.0",
|
|
14
|
+
"eslint-plugin-promise": "^6.1.1",
|
|
15
|
+
"eslint-plugin-react": "^7.33.2",
|
|
16
|
+
"eslint-plugin-react-hooks": "^4.6.0",
|
|
17
|
+
"eslint-plugin-react-refresh": "^0.4.4",
|
|
18
|
+
"rimraf": "^5.0.7",
|
|
19
|
+
"tsx": "^4.15.1",
|
|
20
|
+
"typescript": "^5.2.2"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "rimraf dist && tsc",
|
|
24
|
+
"check-branch": "pnpm build",
|
|
25
|
+
"lint": "echo nothing to lint"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
import { exec } from 'child_process'
|
|
3
|
+
import { access, constants, readFile, writeFile } from 'fs/promises'
|
|
4
|
+
|
|
5
|
+
const variables = {
|
|
6
|
+
timestamp: () => new Date().getTime(),
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function merge(a: any, b: any) {
|
|
10
|
+
if (a === null || typeof a !== 'object') return b
|
|
11
|
+
if (Array.isArray(a) && Array.isArray(b)) return [...a, ...b]
|
|
12
|
+
const result = { ...a }
|
|
13
|
+
for (const key in b) {
|
|
14
|
+
if (typeof b === 'object') result[key] = merge(result[key], b[key])
|
|
15
|
+
else result[key] = b[key]
|
|
16
|
+
}
|
|
17
|
+
return result
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function replaceVariables<T>(data: T): T {
|
|
21
|
+
if (typeof data === 'string') {
|
|
22
|
+
return data.replace(/\{([\w_]+)\}/g, (match, varname) => varname in variables ? `${(variables as any)[varname]()}` : match) as T
|
|
23
|
+
}
|
|
24
|
+
if (Array.isArray(data)) {
|
|
25
|
+
return data.map(replaceVariables) as T
|
|
26
|
+
}
|
|
27
|
+
if (data && typeof data === 'object') {
|
|
28
|
+
const result: Record<string, any> = {}
|
|
29
|
+
for (const key in data) {
|
|
30
|
+
result[key] = replaceVariables(data[key])
|
|
31
|
+
}
|
|
32
|
+
return result as T
|
|
33
|
+
}
|
|
34
|
+
return data
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async function isEnvValid(env: string | undefined): Promise<boolean> {
|
|
38
|
+
if (!env) return false
|
|
39
|
+
try {
|
|
40
|
+
await access(`package.${env}.json`, constants.F_OK)
|
|
41
|
+
return true
|
|
42
|
+
} catch {
|
|
43
|
+
return false
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async function readPackage(suffix?: string) {
|
|
48
|
+
const packageString = await readFile(`package${suffix ? `.${suffix}` : ''}.json`, { encoding: 'utf-8' })
|
|
49
|
+
return [JSON.parse(packageString), packageString]
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async function getEnv(): Promise<string | undefined> {
|
|
53
|
+
const fromCmd = process.argv.join(' ').match(/--env=(\w+)/)?.[1]
|
|
54
|
+
if (fromCmd) return fromCmd.trim()
|
|
55
|
+
try {
|
|
56
|
+
const fromBranchName = await asyncExec('git rev-parse --abbrev-ref HEAD')
|
|
57
|
+
return fromBranchName.trim()
|
|
58
|
+
} catch {
|
|
59
|
+
return undefined
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function getShouldRevert() {
|
|
64
|
+
return !/--revert=false/.test(process.argv.join(' '))
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function prepare(env: string) {
|
|
68
|
+
const [pckg, originalPckg] = await readPackage()
|
|
69
|
+
const [envPckg] = await readPackage(env)
|
|
70
|
+
const resultingPackage = replaceVariables(merge(pckg, envPckg))
|
|
71
|
+
await writeFile('package.json', JSON.stringify(resultingPackage, null, 2), { encoding: 'utf-8' })
|
|
72
|
+
return [originalPckg, resultingPackage]
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function asyncExec(cmd: string, cwd?: string): Promise<string> {
|
|
76
|
+
return new Promise((resolve, reject) => {
|
|
77
|
+
exec(cmd, { cwd }, (error, stdout, stderr) => {
|
|
78
|
+
if (error) reject(`${error.message}\n\n${stdout}\n\n${stderr}`)
|
|
79
|
+
else resolve(stdout)
|
|
80
|
+
})
|
|
81
|
+
})
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async function revert(packageBackup: string) {
|
|
85
|
+
await writeFile('package.json', packageBackup, { encoding: 'utf-8' })
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
async function start() {
|
|
89
|
+
const env = await getEnv()
|
|
90
|
+
if (!(await isEnvValid(env))) {
|
|
91
|
+
console.log('No overrides set for environment:', env)
|
|
92
|
+
return
|
|
93
|
+
}
|
|
94
|
+
const shouldRevert = getShouldRevert()
|
|
95
|
+
console.log(`Overriding dependencies for ${env}...`)
|
|
96
|
+
const [packageBackup] = await prepare(env ?? '')
|
|
97
|
+
try {
|
|
98
|
+
console.log('Installing overridden dependencies...')
|
|
99
|
+
await asyncExec('pnpm i')
|
|
100
|
+
console.log('Done.')
|
|
101
|
+
} finally {
|
|
102
|
+
if (shouldRevert) await revert(packageBackup)
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
start()
|