@infly/libs 2.0.54 → 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.
- package/README.md +115 -3
- package/adapters/webpack/auto-export.js +52 -52
- package/bin/cli.js +12 -0
- package/build/build-utils/command.js +57 -57
- package/build/build-utils/git.js +254 -254
- package/build/build-utils/preview.js +78 -78
- package/build/build-utils/webhook-single.js +136 -136
- package/build/docker/compose-command.js +73 -73
- package/build/docker/compose-release.js +19 -12
- package/build/docker/deployment/deploy.sh +30 -0
- package/build/docker/deployment/health-check.sh +28 -0
- package/build/docker/deployment/promote-image.sh +61 -0
- package/build/docker/deployment/release.sh +74 -0
- package/build/docker/deployment-bundle.js +87 -0
- package/build/docker/target-release.js +180 -0
- package/build/project-files.js +47 -47
- package/cli/progress.js +2 -0
- package/cli/select-option.js +62 -30
- package/core/async/concurrency.js +29 -29
- package/package.json +1 -1
- package/script/git-automation/submodule-utils.js +16 -16
- package/workspace/config.js +144 -144
|
@@ -3,20 +3,20 @@ const fs = require("fs");
|
|
|
3
3
|
function normalizeRelativePath(value) {
|
|
4
4
|
return String(value).replace(/\\/g, "/");
|
|
5
5
|
}
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* 从 .gitmodules 中解析所有子模块路径
|
|
9
|
-
*/
|
|
10
|
-
function parseGitmodulesPaths(rootDir) {
|
|
11
|
-
const p = require("path").join(rootDir, ".gitmodules");
|
|
12
|
-
if (!fs.existsSync(p)) return [];
|
|
13
|
-
const content = fs.readFileSync(p, "utf8");
|
|
14
|
-
const paths = [];
|
|
15
|
-
content.split(/\[submodule/).forEach((block) => {
|
|
16
|
-
const m = block.match(/path\s*=\s*(.+)/);
|
|
17
|
-
if (m) paths.push(m[1].trim());
|
|
18
|
-
});
|
|
19
|
-
return paths;
|
|
20
|
-
}
|
|
21
|
-
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 从 .gitmodules 中解析所有子模块路径
|
|
9
|
+
*/
|
|
10
|
+
function parseGitmodulesPaths(rootDir) {
|
|
11
|
+
const p = require("path").join(rootDir, ".gitmodules");
|
|
12
|
+
if (!fs.existsSync(p)) return [];
|
|
13
|
+
const content = fs.readFileSync(p, "utf8");
|
|
14
|
+
const paths = [];
|
|
15
|
+
content.split(/\[submodule/).forEach((block) => {
|
|
16
|
+
const m = block.match(/path\s*=\s*(.+)/);
|
|
17
|
+
if (m) paths.push(m[1].trim());
|
|
18
|
+
});
|
|
19
|
+
return paths;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
22
|
module.exports = { normalizeRelativePath, parseGitmodulesPaths };
|
package/workspace/config.js
CHANGED
|
@@ -1,146 +1,146 @@
|
|
|
1
1
|
// workspace 配置读取与模式展开。
|
|
2
2
|
const fs = require("fs");
|
|
3
|
-
const path = require("path");
|
|
4
|
-
const YAML = require("yaml");
|
|
5
|
-
|
|
6
|
-
function readJson(filePath) {
|
|
7
|
-
return JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
function readWorkspaceList(content, sectionName) {
|
|
11
|
-
let workspaceConfig;
|
|
12
|
-
|
|
13
|
-
try {
|
|
14
|
-
workspaceConfig = YAML.parse(content);
|
|
15
|
-
} catch (error) {
|
|
16
|
-
throw new Error(`无法解析 pnpm-workspace.yaml: ${error.message}`, { cause: error });
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
if (workspaceConfig == null) {
|
|
20
|
-
return [];
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
if (typeof workspaceConfig !== "object" || Array.isArray(workspaceConfig)) {
|
|
24
|
-
throw new TypeError("pnpm-workspace.yaml 的根节点必须是对象");
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const patterns = workspaceConfig[sectionName];
|
|
28
|
-
|
|
29
|
-
if (patterns == null) {
|
|
30
|
-
return [];
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
if (
|
|
34
|
-
!Array.isArray(patterns)
|
|
35
|
-
|| patterns.some((pattern) => typeof pattern !== "string" || pattern.trim().length === 0)
|
|
36
|
-
) {
|
|
37
|
-
throw new TypeError(`pnpm-workspace.yaml 的 ${sectionName} 必须是非空字符串数组`);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return patterns;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function readWorkspaceSection(workspaceFile, sectionName) {
|
|
44
|
-
return readWorkspaceList(fs.readFileSync(workspaceFile, "utf8"), sectionName);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function readWorkspaceSectionWithFallback(workspaceFile, sectionName, fallbackSectionName) {
|
|
48
|
-
const patterns = readWorkspaceSection(workspaceFile, sectionName);
|
|
49
|
-
|
|
50
|
-
if (patterns.length > 0) {
|
|
51
|
-
return patterns;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
return readWorkspaceSection(workspaceFile, fallbackSectionName);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function expandWorkspacePattern(rootDir, pattern) {
|
|
58
|
-
const normalizedPattern = pattern.replace(/\\/g, "/");
|
|
59
|
-
|
|
60
|
-
if (!normalizedPattern.includes("*")) {
|
|
61
|
-
return [path.join(rootDir, normalizedPattern)];
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const starIndex = normalizedPattern.indexOf("*");
|
|
65
|
-
const basePart = normalizedPattern.slice(0, starIndex);
|
|
66
|
-
const suffixPart = normalizedPattern.slice(starIndex + 1);
|
|
67
|
-
const baseDir = path.join(rootDir, basePart);
|
|
68
|
-
|
|
69
|
-
if (!fs.existsSync(baseDir)) {
|
|
70
|
-
return [];
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const suffixIsNamePattern = suffixPart && !suffixPart.startsWith("/");
|
|
74
|
-
|
|
75
|
-
return fs
|
|
76
|
-
.readdirSync(baseDir, { withFileTypes: true })
|
|
77
|
-
.filter((entry) => entry.isDirectory())
|
|
78
|
-
.filter((entry) => !suffixIsNamePattern || entry.name.endsWith(suffixPart))
|
|
79
|
-
.map((entry) => (suffixIsNamePattern
|
|
80
|
-
? path.join(baseDir, entry.name)
|
|
81
|
-
: path.join(baseDir, entry.name, suffixPart)))
|
|
82
|
-
.filter((packageDir) => fs.existsSync(path.join(packageDir, "package.json")));
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
function getWorkspacePackages(rootDir, workspaceFile, sectionName, fallbackSectionName, scriptName) {
|
|
86
|
-
const patterns = fallbackSectionName
|
|
87
|
-
? readWorkspaceSectionWithFallback(workspaceFile, sectionName, fallbackSectionName)
|
|
88
|
-
: readWorkspaceSection(workspaceFile, sectionName);
|
|
89
|
-
const included = new Set();
|
|
90
|
-
patterns.forEach((pattern) => {
|
|
91
|
-
const excluded = pattern.startsWith("!");
|
|
92
|
-
const resolvedPattern = excluded ? pattern.slice(1) : pattern;
|
|
93
|
-
expandWorkspacePattern(rootDir, resolvedPattern).forEach((packageDir) => {
|
|
94
|
-
const resolvedDir = path.resolve(packageDir);
|
|
95
|
-
if (excluded) included.delete(resolvedDir);
|
|
96
|
-
else included.add(resolvedDir);
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
const packageDirs = [...included];
|
|
100
|
-
const seen = new Set();
|
|
101
|
-
|
|
102
|
-
return packageDirs
|
|
103
|
-
.map((packageDir) => {
|
|
104
|
-
const packageJsonPath = path.join(packageDir, "package.json");
|
|
105
|
-
|
|
106
|
-
if (!fs.existsSync(packageJsonPath)) {
|
|
107
|
-
return null;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const packageJson = readJson(packageJsonPath);
|
|
111
|
-
const scripts = packageJson.scripts || {};
|
|
112
|
-
|
|
113
|
-
if (!packageJson.name || seen.has(packageJson.name) || (scriptName && !scripts[scriptName])) {
|
|
114
|
-
return null;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
seen.add(packageJson.name);
|
|
118
|
-
|
|
119
|
-
return {
|
|
120
|
-
name: packageJson.name,
|
|
121
|
-
dir: path.relative(rootDir, packageDir),
|
|
122
|
-
packageJson,
|
|
123
|
-
};
|
|
124
|
-
})
|
|
125
|
-
.filter(Boolean);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
function toTurboFilter(value) {
|
|
129
|
-
const normalized = value.replace(/\\/g, "/");
|
|
130
|
-
|
|
131
|
-
if (normalized.includes("/") && !normalized.startsWith("./") && !normalized.startsWith("../")) {
|
|
132
|
-
return `./${normalized}`;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
return normalized;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
module.exports = {
|
|
139
|
-
expandWorkspacePattern,
|
|
140
|
-
getWorkspacePackages,
|
|
141
|
-
readJson,
|
|
142
|
-
readWorkspaceList,
|
|
143
|
-
readWorkspaceSection,
|
|
144
|
-
readWorkspaceSectionWithFallback,
|
|
145
|
-
toTurboFilter,
|
|
146
|
-
};
|
|
3
|
+
const path = require("path");
|
|
4
|
+
const YAML = require("yaml");
|
|
5
|
+
|
|
6
|
+
function readJson(filePath) {
|
|
7
|
+
return JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function readWorkspaceList(content, sectionName) {
|
|
11
|
+
let workspaceConfig;
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
workspaceConfig = YAML.parse(content);
|
|
15
|
+
} catch (error) {
|
|
16
|
+
throw new Error(`无法解析 pnpm-workspace.yaml: ${error.message}`, { cause: error });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (workspaceConfig == null) {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (typeof workspaceConfig !== "object" || Array.isArray(workspaceConfig)) {
|
|
24
|
+
throw new TypeError("pnpm-workspace.yaml 的根节点必须是对象");
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const patterns = workspaceConfig[sectionName];
|
|
28
|
+
|
|
29
|
+
if (patterns == null) {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (
|
|
34
|
+
!Array.isArray(patterns)
|
|
35
|
+
|| patterns.some((pattern) => typeof pattern !== "string" || pattern.trim().length === 0)
|
|
36
|
+
) {
|
|
37
|
+
throw new TypeError(`pnpm-workspace.yaml 的 ${sectionName} 必须是非空字符串数组`);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return patterns;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function readWorkspaceSection(workspaceFile, sectionName) {
|
|
44
|
+
return readWorkspaceList(fs.readFileSync(workspaceFile, "utf8"), sectionName);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function readWorkspaceSectionWithFallback(workspaceFile, sectionName, fallbackSectionName) {
|
|
48
|
+
const patterns = readWorkspaceSection(workspaceFile, sectionName);
|
|
49
|
+
|
|
50
|
+
if (patterns.length > 0) {
|
|
51
|
+
return patterns;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return readWorkspaceSection(workspaceFile, fallbackSectionName);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function expandWorkspacePattern(rootDir, pattern) {
|
|
58
|
+
const normalizedPattern = pattern.replace(/\\/g, "/");
|
|
59
|
+
|
|
60
|
+
if (!normalizedPattern.includes("*")) {
|
|
61
|
+
return [path.join(rootDir, normalizedPattern)];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const starIndex = normalizedPattern.indexOf("*");
|
|
65
|
+
const basePart = normalizedPattern.slice(0, starIndex);
|
|
66
|
+
const suffixPart = normalizedPattern.slice(starIndex + 1);
|
|
67
|
+
const baseDir = path.join(rootDir, basePart);
|
|
68
|
+
|
|
69
|
+
if (!fs.existsSync(baseDir)) {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const suffixIsNamePattern = suffixPart && !suffixPart.startsWith("/");
|
|
74
|
+
|
|
75
|
+
return fs
|
|
76
|
+
.readdirSync(baseDir, { withFileTypes: true })
|
|
77
|
+
.filter((entry) => entry.isDirectory())
|
|
78
|
+
.filter((entry) => !suffixIsNamePattern || entry.name.endsWith(suffixPart))
|
|
79
|
+
.map((entry) => (suffixIsNamePattern
|
|
80
|
+
? path.join(baseDir, entry.name)
|
|
81
|
+
: path.join(baseDir, entry.name, suffixPart)))
|
|
82
|
+
.filter((packageDir) => fs.existsSync(path.join(packageDir, "package.json")));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function getWorkspacePackages(rootDir, workspaceFile, sectionName, fallbackSectionName, scriptName) {
|
|
86
|
+
const patterns = fallbackSectionName
|
|
87
|
+
? readWorkspaceSectionWithFallback(workspaceFile, sectionName, fallbackSectionName)
|
|
88
|
+
: readWorkspaceSection(workspaceFile, sectionName);
|
|
89
|
+
const included = new Set();
|
|
90
|
+
patterns.forEach((pattern) => {
|
|
91
|
+
const excluded = pattern.startsWith("!");
|
|
92
|
+
const resolvedPattern = excluded ? pattern.slice(1) : pattern;
|
|
93
|
+
expandWorkspacePattern(rootDir, resolvedPattern).forEach((packageDir) => {
|
|
94
|
+
const resolvedDir = path.resolve(packageDir);
|
|
95
|
+
if (excluded) included.delete(resolvedDir);
|
|
96
|
+
else included.add(resolvedDir);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
const packageDirs = [...included];
|
|
100
|
+
const seen = new Set();
|
|
101
|
+
|
|
102
|
+
return packageDirs
|
|
103
|
+
.map((packageDir) => {
|
|
104
|
+
const packageJsonPath = path.join(packageDir, "package.json");
|
|
105
|
+
|
|
106
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const packageJson = readJson(packageJsonPath);
|
|
111
|
+
const scripts = packageJson.scripts || {};
|
|
112
|
+
|
|
113
|
+
if (!packageJson.name || seen.has(packageJson.name) || (scriptName && !scripts[scriptName])) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
seen.add(packageJson.name);
|
|
118
|
+
|
|
119
|
+
return {
|
|
120
|
+
name: packageJson.name,
|
|
121
|
+
dir: path.relative(rootDir, packageDir),
|
|
122
|
+
packageJson,
|
|
123
|
+
};
|
|
124
|
+
})
|
|
125
|
+
.filter(Boolean);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function toTurboFilter(value) {
|
|
129
|
+
const normalized = value.replace(/\\/g, "/");
|
|
130
|
+
|
|
131
|
+
if (normalized.includes("/") && !normalized.startsWith("./") && !normalized.startsWith("../")) {
|
|
132
|
+
return `./${normalized}`;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return normalized;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
module.exports = {
|
|
139
|
+
expandWorkspacePattern,
|
|
140
|
+
getWorkspacePackages,
|
|
141
|
+
readJson,
|
|
142
|
+
readWorkspaceList,
|
|
143
|
+
readWorkspaceSection,
|
|
144
|
+
readWorkspaceSectionWithFallback,
|
|
145
|
+
toTurboFilter,
|
|
146
|
+
};
|