@xylabs/toolchain 7.10.0 → 7.10.2
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/dist/actions/index.mjs +162 -30
- package/dist/actions/index.mjs.map +1 -1
- package/dist/actions/package/compile/XyConfig.mjs.map +1 -1
- package/dist/actions/package/compile/index.mjs.map +1 -1
- package/dist/actions/package/index.mjs.map +1 -1
- package/dist/actions/package/publint.mjs.map +1 -1
- package/dist/actions/packman/index.mjs +270 -112
- package/dist/actions/packman/index.mjs.map +1 -1
- package/dist/actions/packman/lint.mjs +203 -36
- package/dist/actions/packman/lint.mjs.map +1 -1
- package/dist/actions/publint.mjs.map +1 -1
- package/dist/bin/package/publint.mjs.map +1 -1
- package/dist/bin/xy.mjs +164 -32
- package/dist/bin/xy.mjs.map +1 -1
- package/dist/index.d.ts +23 -2
- package/dist/index.mjs +1040 -811
- package/dist/index.mjs.map +1 -1
- package/dist/lib/deprecationMigrate.mjs +99 -0
- package/dist/lib/deprecationMigrate.mjs.map +1 -0
- package/dist/lib/index.mjs +238 -141
- package/dist/lib/index.mjs.map +1 -1
- package/dist/xy/common/checkCommand.mjs.map +1 -1
- package/dist/xy/common/index.mjs +164 -32
- package/dist/xy/common/index.mjs.map +1 -1
- package/dist/xy/common/packmanCommand.mjs +272 -114
- package/dist/xy/common/packmanCommand.mjs.map +1 -1
- package/dist/xy/index.mjs +164 -32
- package/dist/xy/index.mjs.map +1 -1
- package/dist/xy/lint/index.mjs.map +1 -1
- package/dist/xy/lint/publintCommand.mjs.map +1 -1
- package/dist/xy/xy.mjs +164 -32
- package/dist/xy/xy.mjs.map +1 -1
- package/package.json +4 -3
|
@@ -1,40 +1,106 @@
|
|
|
1
1
|
// src/actions/packman/lint.ts
|
|
2
2
|
import {
|
|
3
|
-
existsSync,
|
|
3
|
+
existsSync as existsSync2,
|
|
4
4
|
readFileSync,
|
|
5
5
|
writeFileSync
|
|
6
6
|
} from "fs";
|
|
7
7
|
import PATH from "path";
|
|
8
|
+
import chalk2 from "chalk";
|
|
9
|
+
|
|
10
|
+
// src/pm/detectPackageManager.ts
|
|
11
|
+
import { existsSync } from "fs";
|
|
12
|
+
function detectPackageManager() {
|
|
13
|
+
if (existsSync("pnpm-lock.yaml") || existsSync("pnpm-workspace.yaml")) return "pnpm";
|
|
14
|
+
return "yarn";
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// src/lib/loadConfig.ts
|
|
8
18
|
import chalk from "chalk";
|
|
19
|
+
import { cosmiconfig } from "cosmiconfig";
|
|
20
|
+
import { TypeScriptLoader } from "cosmiconfig-typescript-loader";
|
|
21
|
+
import deepmerge from "deepmerge";
|
|
22
|
+
var config;
|
|
23
|
+
var rootConfigPath;
|
|
24
|
+
function createExplorer() {
|
|
25
|
+
return cosmiconfig("xy", { cache: true, loaders: { ".ts": TypeScriptLoader() } });
|
|
26
|
+
}
|
|
27
|
+
var loadConfig = async (params) => {
|
|
28
|
+
if (config === void 0) {
|
|
29
|
+
const cosmicConfigResult = await createExplorer().search();
|
|
30
|
+
config = cosmicConfigResult?.config ?? {};
|
|
31
|
+
rootConfigPath = cosmicConfigResult?.filepath;
|
|
32
|
+
const configFilePath = cosmicConfigResult?.filepath;
|
|
33
|
+
if (configFilePath !== void 0) {
|
|
34
|
+
console.log(chalk.green(`Loaded config from ${configFilePath}`));
|
|
35
|
+
if (config.verbose) {
|
|
36
|
+
console.log(chalk.gray(`${JSON.stringify(config, null, 2)}`));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return deepmerge(config, params ?? {});
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// src/actions/packman/lint.ts
|
|
44
|
+
var DEFAULT_MINIMUM_RELEASE_AGE = 4320;
|
|
45
|
+
var DEFAULT_RELEASE_AGE_EXCLUDES = ["'@xylabs/*'", "'@xyo-network/*'"];
|
|
46
|
+
function resolvePackmanConfig(cfg) {
|
|
47
|
+
return {
|
|
48
|
+
minimumReleaseAge: cfg?.minimumReleaseAge ?? DEFAULT_MINIMUM_RELEASE_AGE,
|
|
49
|
+
minimumReleaseAgeExclude: cfg?.minimumReleaseAgeExclude ?? DEFAULT_RELEASE_AGE_EXCLUDES
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function readPnpmWorkspaceYaml(cwd) {
|
|
53
|
+
const wsPath = PATH.join(cwd, "pnpm-workspace.yaml");
|
|
54
|
+
if (!existsSync2(wsPath)) return void 0;
|
|
55
|
+
return readFileSync(wsPath, "utf8");
|
|
56
|
+
}
|
|
57
|
+
function writePnpmWorkspaceYaml(cwd, content) {
|
|
58
|
+
writeFileSync(PATH.join(cwd, "pnpm-workspace.yaml"), content, "utf8");
|
|
59
|
+
}
|
|
60
|
+
function parseYamlListSection(content, sectionName) {
|
|
61
|
+
const items = [];
|
|
62
|
+
let inSection = false;
|
|
63
|
+
for (const line of content.split("\n")) {
|
|
64
|
+
if (new RegExp(String.raw`^${sectionName}\s*:`).test(line)) {
|
|
65
|
+
inSection = true;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (inSection) {
|
|
69
|
+
const match = /^\s+-\s+(.+)$/.exec(line);
|
|
70
|
+
if (match) {
|
|
71
|
+
items.push(match[1].trim());
|
|
72
|
+
} else if (line.trim() && !/^\s/.test(line)) {
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return items;
|
|
78
|
+
}
|
|
9
79
|
function checkEnableScripts(cwd, verbose, silent) {
|
|
10
80
|
const yarnrcPath = PATH.join(cwd, ".yarnrc.yml");
|
|
11
|
-
if (!
|
|
12
|
-
if (verbose) console.log(
|
|
81
|
+
if (!existsSync2(yarnrcPath)) {
|
|
82
|
+
if (verbose) console.log(chalk2.gray(" No .yarnrc.yml found, skipping enableScripts check"));
|
|
13
83
|
return true;
|
|
14
84
|
}
|
|
15
85
|
const content = readFileSync(yarnrcPath, "utf8");
|
|
16
|
-
const
|
|
17
|
-
for (const line of lines) {
|
|
86
|
+
for (const line of content.split("\n")) {
|
|
18
87
|
const trimmed = line.trim();
|
|
19
88
|
if (/^enableScripts\s*:/.test(trimmed)) {
|
|
20
89
|
const value = trimmed.replace(/^enableScripts\s*:\s*/, "").trim();
|
|
21
90
|
if (value === "false") {
|
|
22
|
-
if (verbose) console.log(
|
|
91
|
+
if (verbose) console.log(chalk2.green(" enableScripts is correctly set to false"));
|
|
23
92
|
return true;
|
|
24
93
|
}
|
|
25
|
-
if (!silent) console.log(
|
|
94
|
+
if (!silent) console.log(chalk2.red(" enableScripts is set to", value, "(expected false)"));
|
|
26
95
|
return false;
|
|
27
96
|
}
|
|
28
97
|
}
|
|
29
|
-
if (!silent) console.log(
|
|
98
|
+
if (!silent) console.log(chalk2.red(" enableScripts is not set in .yarnrc.yml (expected false)"));
|
|
30
99
|
return false;
|
|
31
100
|
}
|
|
32
|
-
function fixEnableScripts(cwd
|
|
101
|
+
function fixEnableScripts(cwd) {
|
|
33
102
|
const yarnrcPath = PATH.join(cwd, ".yarnrc.yml");
|
|
34
|
-
if (!
|
|
35
|
-
if (verbose) console.log(chalk.gray(" No .yarnrc.yml found, skipping enableScripts fix"));
|
|
36
|
-
return true;
|
|
37
|
-
}
|
|
103
|
+
if (!existsSync2(yarnrcPath)) return true;
|
|
38
104
|
const content = readFileSync(yarnrcPath, "utf8");
|
|
39
105
|
const lines = content.split("\n");
|
|
40
106
|
let found = false;
|
|
@@ -65,41 +131,142 @@ function fixEnableScripts(cwd, verbose) {
|
|
|
65
131
|
}
|
|
66
132
|
}
|
|
67
133
|
writeFileSync(yarnrcPath, newLines.join("\n"), "utf8");
|
|
68
|
-
console.log(
|
|
134
|
+
console.log(chalk2.green(" Fixed: enableScripts set to false"));
|
|
69
135
|
return true;
|
|
70
136
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
137
|
+
function checkMinimumReleaseAge(cwd, config2, verbose, silent) {
|
|
138
|
+
if (detectPackageManager() !== "pnpm") return true;
|
|
139
|
+
const content = readPnpmWorkspaceYaml(cwd);
|
|
140
|
+
if (!content) {
|
|
141
|
+
if (!silent) console.log(chalk2.red(" No pnpm-workspace.yaml found"));
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
const { minimumReleaseAge } = config2;
|
|
145
|
+
for (const line of content.split("\n")) {
|
|
146
|
+
const match = /^minimumReleaseAge\s*:\s*(\d+)/.exec(line.trim());
|
|
147
|
+
if (match) {
|
|
148
|
+
const value = Number.parseInt(match[1], 10);
|
|
149
|
+
if (value >= minimumReleaseAge) {
|
|
150
|
+
if (verbose) console.log(chalk2.green(` minimumReleaseAge is ${value} (>= ${minimumReleaseAge})`));
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
if (!silent) console.log(chalk2.red(` minimumReleaseAge is ${value} (expected >= ${minimumReleaseAge})`));
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
76
156
|
}
|
|
77
|
-
|
|
78
|
-
|
|
157
|
+
if (!silent) console.log(chalk2.red(` minimumReleaseAge is not set in pnpm-workspace.yaml (expected >= ${minimumReleaseAge})`));
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
function fixMinimumReleaseAge(cwd, config2) {
|
|
161
|
+
if (detectPackageManager() !== "pnpm") return true;
|
|
162
|
+
const content = readPnpmWorkspaceYaml(cwd);
|
|
163
|
+
if (!content) return false;
|
|
164
|
+
const { minimumReleaseAge } = config2;
|
|
165
|
+
const lines = content.split("\n");
|
|
166
|
+
let found = false;
|
|
167
|
+
const newLines = lines.map((line) => {
|
|
168
|
+
if (/^minimumReleaseAge\s*:/.test(line)) {
|
|
169
|
+
found = true;
|
|
170
|
+
return `minimumReleaseAge: ${minimumReleaseAge}`;
|
|
171
|
+
}
|
|
172
|
+
return line;
|
|
173
|
+
});
|
|
174
|
+
if (!found) {
|
|
175
|
+
const lastLine = newLines.at(-1);
|
|
176
|
+
if (lastLine === "") {
|
|
177
|
+
newLines.splice(-1, 0, `minimumReleaseAge: ${minimumReleaseAge}`);
|
|
178
|
+
} else {
|
|
179
|
+
newLines.push(`minimumReleaseAge: ${minimumReleaseAge}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
writePnpmWorkspaceYaml(cwd, newLines.join("\n"));
|
|
183
|
+
console.log(chalk2.green(` Fixed: minimumReleaseAge set to ${minimumReleaseAge}`));
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
function checkMinimumReleaseAgeExclude(cwd, config2, verbose, silent) {
|
|
187
|
+
if (detectPackageManager() !== "pnpm") return true;
|
|
188
|
+
const content = readPnpmWorkspaceYaml(cwd);
|
|
189
|
+
if (!content) {
|
|
190
|
+
if (!silent) console.log(chalk2.red(" No pnpm-workspace.yaml found"));
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
const excludes = parseYamlListSection(content, "minimumReleaseAgeExclude");
|
|
194
|
+
const missing = config2.minimumReleaseAgeExclude.filter((scope) => !excludes.includes(scope));
|
|
195
|
+
if (missing.length === 0) {
|
|
196
|
+
if (verbose) console.log(chalk2.green(" minimumReleaseAgeExclude includes all required scopes"));
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
if (!silent) console.log(chalk2.red(` minimumReleaseAgeExclude is missing: ${missing.join(", ")}`));
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
function fixMinimumReleaseAgeExclude(cwd, config2) {
|
|
203
|
+
if (detectPackageManager() !== "pnpm") return true;
|
|
204
|
+
const content = readPnpmWorkspaceYaml(cwd);
|
|
205
|
+
if (!content) return false;
|
|
206
|
+
const existingExcludes = parseYamlListSection(content, "minimumReleaseAgeExclude");
|
|
207
|
+
const toAdd = config2.minimumReleaseAgeExclude.filter((scope) => !existingExcludes.includes(scope));
|
|
208
|
+
if (toAdd.length === 0) return true;
|
|
209
|
+
const lines = content.split("\n");
|
|
210
|
+
const sectionIndex = lines.findIndex((line) => /^minimumReleaseAgeExclude\s*:/.test(line));
|
|
211
|
+
if (sectionIndex === -1) {
|
|
212
|
+
const newSection = ["minimumReleaseAgeExclude:", ...config2.minimumReleaseAgeExclude.map((s) => ` - ${s}`)];
|
|
213
|
+
const lastLine = lines.at(-1);
|
|
214
|
+
if (lastLine === "") {
|
|
215
|
+
lines.splice(-1, 0, ...newSection);
|
|
216
|
+
} else {
|
|
217
|
+
lines.push(...newSection);
|
|
218
|
+
}
|
|
219
|
+
} else {
|
|
220
|
+
let insertAt = sectionIndex + 1;
|
|
221
|
+
while (insertAt < lines.length && /^\s+-/.test(lines[insertAt])) {
|
|
222
|
+
insertAt++;
|
|
223
|
+
}
|
|
224
|
+
for (const scope of toAdd) {
|
|
225
|
+
lines.splice(insertAt, 0, ` - ${scope}`);
|
|
226
|
+
insertAt++;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
writePnpmWorkspaceYaml(cwd, lines.join("\n"));
|
|
230
|
+
console.log(chalk2.green(` Fixed: added ${toAdd.join(", ")} to minimumReleaseAgeExclude`));
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
async function packmanLint({ fix, verbose } = {}) {
|
|
79
234
|
const cwd = process.cwd();
|
|
235
|
+
const rootConfig = await loadConfig();
|
|
236
|
+
const packmanConfig = resolvePackmanConfig(rootConfig.commands ? rootConfig.commands.packman : void 0);
|
|
80
237
|
let failures = 0;
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
238
|
+
const enableScriptsPassed = checkEnableScripts(cwd, verbose, fix);
|
|
239
|
+
if (!enableScriptsPassed) {
|
|
240
|
+
if (fix) {
|
|
241
|
+
if (!fixEnableScripts(cwd)) failures++;
|
|
242
|
+
} else {
|
|
243
|
+
failures++;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
const agePassed = checkMinimumReleaseAge(cwd, packmanConfig, verbose, fix);
|
|
247
|
+
if (!agePassed) {
|
|
248
|
+
if (fix) {
|
|
249
|
+
if (!fixMinimumReleaseAge(cwd, packmanConfig)) failures++;
|
|
250
|
+
} else {
|
|
251
|
+
failures++;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const excludePassed = checkMinimumReleaseAgeExclude(cwd, packmanConfig, verbose, fix);
|
|
255
|
+
if (!excludePassed) {
|
|
256
|
+
if (fix) {
|
|
257
|
+
if (!fixMinimumReleaseAgeExclude(cwd, packmanConfig)) failures++;
|
|
258
|
+
} else {
|
|
259
|
+
failures++;
|
|
93
260
|
}
|
|
94
261
|
}
|
|
95
262
|
if (failures > 0) {
|
|
96
|
-
console.log(
|
|
263
|
+
console.log(chalk2.red(`
|
|
97
264
|
packman lint: ${failures} check(s) failed`));
|
|
98
265
|
if (!fix) {
|
|
99
|
-
console.log(
|
|
266
|
+
console.log(chalk2.yellow("Run with --fix to auto-fix issues"));
|
|
100
267
|
}
|
|
101
268
|
} else {
|
|
102
|
-
console.log(
|
|
269
|
+
console.log(chalk2.green("\npackman lint: all checks passed"));
|
|
103
270
|
}
|
|
104
271
|
return failures > 0 ? 1 : 0;
|
|
105
272
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/actions/packman/lint.ts"],"sourcesContent":["import {\n existsSync, readFileSync, writeFileSync,\n} from 'node:fs'\nimport PATH from 'node:path'\n\nimport chalk from 'chalk'\n\nexport interface PackmanLintParams {\n fix?: boolean\n verbose?: boolean\n}\n\ninterface LintCheck {\n check: (cwd: string, verbose?: boolean, silent?: boolean) => boolean\n fix: (cwd: string, verbose?: boolean) => boolean\n name: string\n}\n\nfunction checkEnableScripts(cwd: string, verbose?: boolean, silent?: boolean): boolean {\n const yarnrcPath = PATH.join(cwd, '.yarnrc.yml')\n if (!existsSync(yarnrcPath)) {\n if (verbose) console.log(chalk.gray(' No .yarnrc.yml found, skipping enableScripts check'))\n return true\n }\n\n const content = readFileSync(yarnrcPath, 'utf8')\n const lines = content.split('\\n')\n\n for (const line of lines) {\n const trimmed = line.trim()\n if (/^enableScripts\\s*:/.test(trimmed)) {\n const value = trimmed.replace(/^enableScripts\\s*:\\s*/, '').trim()\n if (value === 'false') {\n if (verbose) console.log(chalk.green(' enableScripts is correctly set to false'))\n return true\n }\n if (!silent) console.log(chalk.red(' enableScripts is set to', value, '(expected false)'))\n return false\n }\n }\n\n if (!silent) console.log(chalk.red(' enableScripts is not set in .yarnrc.yml (expected false)'))\n return false\n}\n\nfunction fixEnableScripts(cwd: string, verbose?: boolean): boolean {\n const yarnrcPath = PATH.join(cwd, '.yarnrc.yml')\n if (!existsSync(yarnrcPath)) {\n if (verbose) console.log(chalk.gray(' No .yarnrc.yml found, skipping enableScripts fix'))\n return true\n }\n\n const content = readFileSync(yarnrcPath, 'utf8')\n const lines = content.split('\\n')\n\n let found = false\n const newLines = lines.map((line) => {\n if (/^\\s*enableScripts\\s*:/.test(line)) {\n found = true\n return 'enableScripts: false'\n }\n return line\n })\n\n if (!found) {\n // Insert enableScripts: false in alphabetical order\n let inserted = false\n for (let i = 0; i < newLines.length; i++) {\n const trimmed = newLines[i].trim()\n // Skip empty lines and comments at the beginning\n if (trimmed && !trimmed.startsWith('#') && trimmed > 'enableScripts:') {\n newLines.splice(i, 0, 'enableScripts: false', '')\n inserted = true\n break\n }\n }\n if (!inserted) {\n // Append before trailing newline\n const lastLine = newLines.at(-1)\n if (lastLine === '') {\n newLines.splice(-1, 0, 'enableScripts: false', '')\n } else {\n newLines.push('', 'enableScripts: false')\n }\n }\n }\n\n writeFileSync(yarnrcPath, newLines.join('\\n'), 'utf8')\n console.log(chalk.green(' Fixed: enableScripts set to false'))\n return true\n}\n\nconst checks: LintCheck[] = [\n {\n name: 'enableScripts should be false in .yarnrc.yml',\n check: checkEnableScripts,\n fix: fixEnableScripts,\n },\n]\n\nexport function packmanLint({ fix, verbose }: PackmanLintParams = {}): number {\n const cwd = process.cwd()\n let failures = 0\n\n for (const check of checks) {\n if (verbose) console.log(chalk.gray(`Checking: ${check.name}`))\n\n const passed = check.check(cwd, verbose, fix)\n if (!passed) {\n if (fix) {\n const fixed = check.fix(cwd, verbose)\n if (!fixed) {\n failures++\n }\n } else {\n failures++\n }\n }\n }\n\n if (failures > 0) {\n console.log(chalk.red(`\\npackman lint: ${failures} check(s) failed`))\n if (!fix) {\n console.log(chalk.yellow('Run with --fix to auto-fix issues'))\n }\n } else {\n console.log(chalk.green('\\npackman lint: all checks passed'))\n }\n\n return failures > 0 ? 1 : 0\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/actions/packman/lint.ts","../../../src/pm/detectPackageManager.ts","../../../src/lib/loadConfig.ts"],"sourcesContent":["import {\n existsSync, readFileSync, writeFileSync,\n} from 'node:fs'\nimport PATH from 'node:path'\n\nimport chalk from 'chalk'\n\nimport { loadConfig } from '../../lib/index.ts'\nimport { detectPackageManager } from '../../pm/index.ts'\nimport type { PackmanConfig } from '../package/compile/index.ts'\n\nexport interface PackmanLintParams {\n fix?: boolean\n verbose?: boolean\n}\n\ninterface ResolvedPackmanConfig {\n minimumReleaseAge: number\n minimumReleaseAgeExclude: string[]\n}\n\nconst DEFAULT_MINIMUM_RELEASE_AGE = 4320 // 3 days in minutes\nconst DEFAULT_RELEASE_AGE_EXCLUDES = [\"'@xylabs/*'\", \"'@xyo-network/*'\"]\n\nfunction resolvePackmanConfig(cfg?: PackmanConfig): ResolvedPackmanConfig {\n return {\n minimumReleaseAge: cfg?.minimumReleaseAge ?? DEFAULT_MINIMUM_RELEASE_AGE,\n minimumReleaseAgeExclude: cfg?.minimumReleaseAgeExclude ?? DEFAULT_RELEASE_AGE_EXCLUDES,\n }\n}\n\nfunction readPnpmWorkspaceYaml(cwd: string): string | undefined {\n const wsPath = PATH.join(cwd, 'pnpm-workspace.yaml')\n if (!existsSync(wsPath)) return undefined\n return readFileSync(wsPath, 'utf8')\n}\n\nfunction writePnpmWorkspaceYaml(cwd: string, content: string): void {\n writeFileSync(PATH.join(cwd, 'pnpm-workspace.yaml'), content, 'utf8')\n}\n\nfunction parseYamlListSection(content: string, sectionName: string): string[] {\n const items: string[] = []\n let inSection = false\n for (const line of content.split('\\n')) {\n if (new RegExp(String.raw`^${sectionName}\\s*:`).test(line)) {\n inSection = true\n continue\n }\n if (inSection) {\n const match = /^\\s+-\\s+(.+)$/.exec(line)\n if (match) {\n items.push(match[1].trim())\n } else if (line.trim() && !/^\\s/.test(line)) {\n break\n }\n }\n }\n return items\n}\n\n// --- Yarn checks ---\n\nfunction checkEnableScripts(cwd: string, verbose?: boolean, silent?: boolean): boolean {\n const yarnrcPath = PATH.join(cwd, '.yarnrc.yml')\n if (!existsSync(yarnrcPath)) {\n if (verbose) console.log(chalk.gray(' No .yarnrc.yml found, skipping enableScripts check'))\n return true\n }\n\n const content = readFileSync(yarnrcPath, 'utf8')\n for (const line of content.split('\\n')) {\n const trimmed = line.trim()\n if (/^enableScripts\\s*:/.test(trimmed)) {\n const value = trimmed.replace(/^enableScripts\\s*:\\s*/, '').trim()\n if (value === 'false') {\n if (verbose) console.log(chalk.green(' enableScripts is correctly set to false'))\n return true\n }\n if (!silent) console.log(chalk.red(' enableScripts is set to', value, '(expected false)'))\n return false\n }\n }\n\n if (!silent) console.log(chalk.red(' enableScripts is not set in .yarnrc.yml (expected false)'))\n return false\n}\n\nfunction fixEnableScripts(cwd: string): boolean {\n const yarnrcPath = PATH.join(cwd, '.yarnrc.yml')\n if (!existsSync(yarnrcPath)) return true\n\n const content = readFileSync(yarnrcPath, 'utf8')\n const lines = content.split('\\n')\n\n let found = false\n const newLines = lines.map((line) => {\n if (/^\\s*enableScripts\\s*:/.test(line)) {\n found = true\n return 'enableScripts: false'\n }\n return line\n })\n\n if (!found) {\n let inserted = false\n for (let i = 0; i < newLines.length; i++) {\n const trimmed = newLines[i].trim()\n if (trimmed && !trimmed.startsWith('#') && trimmed > 'enableScripts:') {\n newLines.splice(i, 0, 'enableScripts: false', '')\n inserted = true\n break\n }\n }\n if (!inserted) {\n const lastLine = newLines.at(-1)\n if (lastLine === '') {\n newLines.splice(-1, 0, 'enableScripts: false', '')\n } else {\n newLines.push('', 'enableScripts: false')\n }\n }\n }\n\n writeFileSync(yarnrcPath, newLines.join('\\n'), 'utf8')\n console.log(chalk.green(' Fixed: enableScripts set to false'))\n return true\n}\n\n// --- pnpm checks ---\n\nfunction checkMinimumReleaseAge(cwd: string, config: ResolvedPackmanConfig, verbose?: boolean, silent?: boolean): boolean {\n if (detectPackageManager() !== 'pnpm') return true\n\n const content = readPnpmWorkspaceYaml(cwd)\n if (!content) {\n if (!silent) console.log(chalk.red(' No pnpm-workspace.yaml found'))\n return false\n }\n\n const { minimumReleaseAge } = config\n for (const line of content.split('\\n')) {\n const match = /^minimumReleaseAge\\s*:\\s*(\\d+)/.exec(line.trim())\n if (match) {\n const value = Number.parseInt(match[1], 10)\n if (value >= minimumReleaseAge) {\n if (verbose) console.log(chalk.green(` minimumReleaseAge is ${value} (>= ${minimumReleaseAge})`))\n return true\n }\n if (!silent) console.log(chalk.red(` minimumReleaseAge is ${value} (expected >= ${minimumReleaseAge})`))\n return false\n }\n }\n\n if (!silent) console.log(chalk.red(` minimumReleaseAge is not set in pnpm-workspace.yaml (expected >= ${minimumReleaseAge})`))\n return false\n}\n\nfunction fixMinimumReleaseAge(cwd: string, config: ResolvedPackmanConfig): boolean {\n if (detectPackageManager() !== 'pnpm') return true\n\n const content = readPnpmWorkspaceYaml(cwd)\n if (!content) return false\n\n const { minimumReleaseAge } = config\n const lines = content.split('\\n')\n let found = false\n const newLines = lines.map((line) => {\n if (/^minimumReleaseAge\\s*:/.test(line)) {\n found = true\n return `minimumReleaseAge: ${minimumReleaseAge}`\n }\n return line\n })\n\n if (!found) {\n const lastLine = newLines.at(-1)\n if (lastLine === '') {\n newLines.splice(-1, 0, `minimumReleaseAge: ${minimumReleaseAge}`)\n } else {\n newLines.push(`minimumReleaseAge: ${minimumReleaseAge}`)\n }\n }\n\n writePnpmWorkspaceYaml(cwd, newLines.join('\\n'))\n console.log(chalk.green(` Fixed: minimumReleaseAge set to ${minimumReleaseAge}`))\n return true\n}\n\nfunction checkMinimumReleaseAgeExclude(cwd: string, config: ResolvedPackmanConfig, verbose?: boolean, silent?: boolean): boolean {\n if (detectPackageManager() !== 'pnpm') return true\n\n const content = readPnpmWorkspaceYaml(cwd)\n if (!content) {\n if (!silent) console.log(chalk.red(' No pnpm-workspace.yaml found'))\n return false\n }\n\n const excludes = parseYamlListSection(content, 'minimumReleaseAgeExclude')\n const missing = config.minimumReleaseAgeExclude.filter(scope => !excludes.includes(scope))\n\n if (missing.length === 0) {\n if (verbose) console.log(chalk.green(' minimumReleaseAgeExclude includes all required scopes'))\n return true\n }\n\n if (!silent) console.log(chalk.red(` minimumReleaseAgeExclude is missing: ${missing.join(', ')}`))\n return false\n}\n\nfunction fixMinimumReleaseAgeExclude(cwd: string, config: ResolvedPackmanConfig): boolean {\n if (detectPackageManager() !== 'pnpm') return true\n\n const content = readPnpmWorkspaceYaml(cwd)\n if (!content) return false\n\n const existingExcludes = parseYamlListSection(content, 'minimumReleaseAgeExclude')\n const toAdd = config.minimumReleaseAgeExclude.filter(scope => !existingExcludes.includes(scope))\n if (toAdd.length === 0) return true\n\n const lines = content.split('\\n')\n const sectionIndex = lines.findIndex(line => /^minimumReleaseAgeExclude\\s*:/.test(line))\n\n if (sectionIndex === -1) {\n const newSection = ['minimumReleaseAgeExclude:', ...config.minimumReleaseAgeExclude.map(s => ` - ${s}`)]\n const lastLine = lines.at(-1)\n if (lastLine === '') {\n lines.splice(-1, 0, ...newSection)\n } else {\n lines.push(...newSection)\n }\n } else {\n let insertAt = sectionIndex + 1\n while (insertAt < lines.length && /^\\s+-/.test(lines[insertAt])) {\n insertAt++\n }\n for (const scope of toAdd) {\n lines.splice(insertAt, 0, ` - ${scope}`)\n insertAt++\n }\n }\n\n writePnpmWorkspaceYaml(cwd, lines.join('\\n'))\n console.log(chalk.green(` Fixed: added ${toAdd.join(', ')} to minimumReleaseAgeExclude`))\n return true\n}\n\nexport async function packmanLint({ fix, verbose }: PackmanLintParams = {}): Promise<number> {\n const cwd = process.cwd()\n const rootConfig = await loadConfig()\n const packmanConfig = resolvePackmanConfig((rootConfig as Record<string, unknown>).commands\n ? ((rootConfig as Record<string, Record<string, unknown>>).commands.packman as PackmanConfig | undefined)\n : undefined)\n\n let failures = 0\n\n // Yarn checks\n const enableScriptsPassed = checkEnableScripts(cwd, verbose, fix)\n if (!enableScriptsPassed) {\n if (fix) {\n if (!fixEnableScripts(cwd)) failures++\n } else {\n failures++\n }\n }\n\n // pnpm checks\n const agePassed = checkMinimumReleaseAge(cwd, packmanConfig, verbose, fix)\n if (!agePassed) {\n if (fix) {\n if (!fixMinimumReleaseAge(cwd, packmanConfig)) failures++\n } else {\n failures++\n }\n }\n\n const excludePassed = checkMinimumReleaseAgeExclude(cwd, packmanConfig, verbose, fix)\n if (!excludePassed) {\n if (fix) {\n if (!fixMinimumReleaseAgeExclude(cwd, packmanConfig)) failures++\n } else {\n failures++\n }\n }\n\n if (failures > 0) {\n console.log(chalk.red(`\\npackman lint: ${failures} check(s) failed`))\n if (!fix) {\n console.log(chalk.yellow('Run with --fix to auto-fix issues'))\n }\n } else {\n console.log(chalk.green('\\npackman lint: all checks passed'))\n }\n\n return failures > 0 ? 1 : 0\n}\n","import { existsSync } from 'node:fs'\n\nexport type PackageManagerName = 'pnpm' | 'yarn'\n\nexport function detectPackageManager(): PackageManagerName {\n if (existsSync('pnpm-lock.yaml') || existsSync('pnpm-workspace.yaml')) return 'pnpm'\n return 'yarn'\n}\n","import chalk from 'chalk'\nimport { cosmiconfig } from 'cosmiconfig'\nimport { TypeScriptLoader } from 'cosmiconfig-typescript-loader'\nimport deepmerge from 'deepmerge'\n\nlet config: Record<string, unknown>\nlet rootConfigPath: string | undefined\n\nconst workspaceConfigCache = new Map<string, Record<string, unknown>>()\nconst deprecationWarned = new Set<string>()\n\nfunction createExplorer() {\n return cosmiconfig('xy', { cache: true, loaders: { '.ts': TypeScriptLoader() } })\n}\n\nexport const loadConfig = async <T extends object>(params?: T): Promise<T> => {\n if (config === undefined) {\n const cosmicConfigResult = await createExplorer().search()\n config = (cosmicConfigResult?.config ?? {}) as Record<string, unknown>\n rootConfigPath = cosmicConfigResult?.filepath\n const configFilePath = cosmicConfigResult?.filepath\n if (configFilePath !== undefined) {\n console.log(chalk.green(`Loaded config from ${configFilePath}`))\n if (config.verbose) {\n console.log(chalk.gray(`${JSON.stringify(config, null, 2)}`))\n }\n }\n }\n return deepmerge(config, params ?? {}) as T\n}\n\n/**\n * Loads the xy.config from a specific workspace directory.\n * Returns an empty object if the workspace has no config or if\n * the found config is the root config (avoids double-applying).\n */\nasync function loadWorkspaceConfig(workspaceDir: string): Promise<Record<string, unknown>> {\n const cached = workspaceConfigCache.get(workspaceDir)\n if (cached !== undefined) return cached\n\n const result = await createExplorer().search(workspaceDir)\n\n // If no config found or it's the root config, no workspace override\n if (!result || result.filepath === rootConfigPath) {\n workspaceConfigCache.set(workspaceDir, {})\n return {}\n }\n\n const wsConfig = (result.config ?? {}) as Record<string, unknown>\n workspaceConfigCache.set(workspaceDir, wsConfig)\n return wsConfig\n}\n\n/** Deprecated top-level fields that should be under `commands`. */\nconst DEPRECATED_COMMAND_FIELDS = new Set(['deplint', 'publint'])\n\n/**\n * Resolves a command's config field from a config object.\n * Prefers `commands.[name]` over top-level `[name]`.\n * Warns once per config file when a deprecated top-level field is used.\n */\nfunction resolveCommandField(\n cfg: Record<string, unknown>,\n commandName: string,\n configPath?: string,\n): Record<string, unknown> {\n const commands = cfg.commands as Record<string, unknown> | undefined\n const fromCommands = commands?.[commandName]\n const fromTopLevel = cfg[commandName]\n\n if (fromCommands !== undefined && typeof fromCommands === 'object') {\n return fromCommands as Record<string, unknown>\n }\n\n if (fromTopLevel !== undefined && typeof fromTopLevel === 'object'\n && DEPRECATED_COMMAND_FIELDS.has(commandName)) {\n const key = `${configPath ?? 'unknown'}:${commandName}`\n if (!deprecationWarned.has(key)) {\n deprecationWarned.add(key)\n console.warn(chalk.yellow(\n `[xy] Deprecated: top-level \"${commandName}\" in ${configPath ?? 'xy.config'} — move to \"commands.${commandName}\"`,\n ))\n }\n return fromTopLevel as Record<string, unknown>\n }\n\n return {}\n}\n\n/**\n * Loads a command-specific config merged from root and workspace levels.\n * The root config provides defaults; the workspace config extends/overrides.\n * Arrays (e.g. `exclude`) are unioned and maps (e.g. `packages`) are merged\n * via deepmerge, with workspace entries overriding root entries for the same key.\n */\nexport async function loadWorkspaceCommandConfig<C>(\n workspaceDir: string,\n commandName: string,\n): Promise<C> {\n // Ensure root config is loaded\n const root = await loadConfig()\n const rootCmd = resolveCommandField(root as Record<string, unknown>, commandName, rootConfigPath)\n\n const wsConfig = await loadWorkspaceConfig(workspaceDir)\n const wsConfigPath = workspaceConfigCache.has(workspaceDir) ? workspaceDir : undefined\n const wsCmd = resolveCommandField(wsConfig, commandName, wsConfigPath)\n\n return deepmerge(rootCmd, wsCmd) as C\n}\n"],"mappings":"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","names":["existsSync","chalk","existsSync","chalk","config"]}
|