@outfitter/tooling 0.3.0 → 0.3.4
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/.markdownlint-cli2.jsonc +55 -55
- package/README.md +21 -21
- package/dist/bun-version-compat.d.ts +2 -0
- package/dist/bun-version-compat.js +10 -0
- package/dist/cli/check-boundary-invocations.js +2 -2
- package/dist/cli/check-bunup-registry.js +2 -2
- package/dist/cli/check-changeset.js +2 -2
- package/dist/cli/check-clean-tree.js +2 -2
- package/dist/cli/check-exports.js +2 -2
- package/dist/cli/check-markdown-links.d.ts +42 -0
- package/dist/cli/check-markdown-links.js +13 -0
- package/dist/cli/check-readme-imports.d.ts +2 -3
- package/dist/cli/check-readme-imports.js +4 -4
- package/dist/cli/check-tsdoc.js +2 -2
- package/dist/cli/check.js +2 -2
- package/dist/cli/fix.js +2 -2
- package/dist/cli/index.js +49 -1221
- package/dist/cli/init.js +2 -2
- package/dist/cli/pre-push.d.ts +13 -1
- package/dist/cli/pre-push.js +5 -3
- package/dist/cli/upgrade-bun.js +3 -2
- package/dist/index.d.ts +6 -186
- package/dist/index.js +4 -42
- package/dist/registry/build.d.ts +1 -3
- package/dist/registry/build.js +187 -58
- package/dist/registry/index.js +1 -13
- package/dist/registry/schema.js +22 -6
- package/dist/shared/@outfitter/{tooling-9errkcvk.js → tooling-1hez6j9d.js} +1 -1
- package/dist/shared/@outfitter/{tooling-cj5vsa9k.js → tooling-6cxfdx0q.js} +21 -18
- package/dist/shared/@outfitter/{tooling-qk5xgmxr.js → tooling-875svjnz.js} +5 -4
- package/dist/shared/@outfitter/{tooling-mxwc1n8w.js → tooling-9ram55dd.js} +4 -3
- package/dist/shared/@outfitter/{tooling-0x5q15ec.js → tooling-a4bfx4be.js} +1 -1
- package/dist/shared/@outfitter/{tooling-r9976n43.js → tooling-amrbp7cm.js} +6 -4
- package/dist/shared/@outfitter/{tooling-2n2dpsaa.js → tooling-d363b88r.js} +38 -12
- package/dist/shared/@outfitter/{tooling-1y8w5ahg.js → tooling-gcdvsqqp.js} +7 -4
- package/dist/shared/@outfitter/{tooling-enjcenja.js → tooling-h04te11c.js} +6 -4
- package/dist/shared/@outfitter/tooling-ja1zg5yc.js +214 -0
- package/dist/shared/@outfitter/tooling-mkynjra9.js +23 -0
- package/dist/shared/@outfitter/{tooling-9yzd08v1.js → tooling-pq47jv6t.js} +72 -5
- package/dist/shared/@outfitter/tooling-vjmhvpjq.d.ts +29 -0
- package/dist/shared/@outfitter/{tooling-t17gnh9b.js → tooling-wwm97f47.js} +8 -5
- package/dist/version.js +1 -1
- package/package.json +134 -130
- package/registry/registry.json +18 -11
- package/tsconfig.preset.bun.json +5 -5
- package/tsconfig.preset.json +33 -33
- package/biome.json +0 -81
- package/dist/shared/@outfitter/tooling-kcvs6mys.js +0 -1
- package/dist/shared/@outfitter/tooling-wv09k6hr.js +0 -23
- package/dist/shared/chunk-3s189drz.js +0 -4
- package/dist/shared/chunk-7tdgbqb0.js +0 -197
- package/dist/shared/chunk-cmde0fwx.js +0 -421
- /package/dist/shared/@outfitter/{tooling-dvwh9qve.js → tooling-jnrs9rqd.js} +0 -0
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
// @bun
|
|
2
|
+
import {
|
|
3
|
+
isTypesBunVersionCompatible,
|
|
4
|
+
parseSemver
|
|
5
|
+
} from "./tooling-mkynjra9.js";
|
|
6
|
+
|
|
2
7
|
// packages/tooling/src/cli/upgrade-bun.ts
|
|
3
8
|
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
4
9
|
import { join } from "path";
|
|
@@ -34,15 +39,61 @@ async function fetchLatestVersion() {
|
|
|
34
39
|
}
|
|
35
40
|
return match[1];
|
|
36
41
|
}
|
|
42
|
+
async function resolveTypesBunVersion(targetVersion) {
|
|
43
|
+
const response = await fetch("https://registry.npmjs.org/@types%2fbun");
|
|
44
|
+
if (!response.ok) {
|
|
45
|
+
throw new Error(`Failed to fetch @types/bun metadata: ${response.status}`);
|
|
46
|
+
}
|
|
47
|
+
const data = await response.json();
|
|
48
|
+
if (data.versions && Object.hasOwn(data.versions, targetVersion)) {
|
|
49
|
+
return targetVersion;
|
|
50
|
+
}
|
|
51
|
+
if (data.versions) {
|
|
52
|
+
const compatible = Object.keys(data.versions).filter((candidate) => isTypesBunVersionCompatible(targetVersion, candidate)).map((candidate) => ({
|
|
53
|
+
version: candidate,
|
|
54
|
+
parsed: parseSemver(candidate)
|
|
55
|
+
})).filter((candidate) => !!candidate.parsed).toSorted((left, right) => right.parsed.patch - left.parsed.patch);
|
|
56
|
+
const preferred = compatible[0];
|
|
57
|
+
if (preferred) {
|
|
58
|
+
return preferred.version;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const latest = data["dist-tags"]?.latest;
|
|
62
|
+
if (latest && isTypesBunVersionCompatible(targetVersion, latest)) {
|
|
63
|
+
return latest;
|
|
64
|
+
}
|
|
65
|
+
return targetVersion;
|
|
66
|
+
}
|
|
37
67
|
function findPackageJsonFiles(dir) {
|
|
38
|
-
const
|
|
68
|
+
const files = new Set;
|
|
39
69
|
const glob = new Bun.Glob("**/package.json");
|
|
40
70
|
for (const path of glob.scanSync({ cwd: dir })) {
|
|
41
71
|
if (!path.includes("node_modules")) {
|
|
42
|
-
|
|
72
|
+
files.add(join(dir, path));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const gitList = Bun.spawnSync(["git", "ls-files", "--cached", "--others", "--exclude-standard"], { cwd: dir });
|
|
76
|
+
if (gitList.exitCode === 0) {
|
|
77
|
+
const trackedAndUntrackedFiles = new TextDecoder().decode(gitList.stdout).split(`
|
|
78
|
+
`).filter((path) => path.endsWith("package.json")).filter((path) => !path.includes("node_modules")).map((path) => join(dir, path)).filter((path) => existsSync(path));
|
|
79
|
+
for (const filePath of trackedAndUntrackedFiles) {
|
|
80
|
+
files.add(filePath);
|
|
43
81
|
}
|
|
44
82
|
}
|
|
45
|
-
return
|
|
83
|
+
return [...files].toSorted();
|
|
84
|
+
}
|
|
85
|
+
function updatePackageManager(filePath, version) {
|
|
86
|
+
const content = readFileSync(filePath, "utf-8");
|
|
87
|
+
const pattern = /"packageManager":\s*"bun@[\d.]+"/;
|
|
88
|
+
if (!pattern.test(content)) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
const updated = content.replace(pattern, `"packageManager": "bun@${version}"`);
|
|
92
|
+
if (updated !== content) {
|
|
93
|
+
writeFileSync(filePath, updated);
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
return false;
|
|
46
97
|
}
|
|
47
98
|
function updateEnginesBun(filePath, version) {
|
|
48
99
|
const content = readFileSync(filePath, "utf-8");
|
|
@@ -88,10 +139,26 @@ async function runUpgradeBun(targetVersion, options = {}) {
|
|
|
88
139
|
log("");
|
|
89
140
|
info(`Upgrading Bun: ${currentVersion} \u2192 ${version}`);
|
|
90
141
|
log("");
|
|
142
|
+
let typesVersion = version;
|
|
143
|
+
try {
|
|
144
|
+
info("Resolving @types/bun version...");
|
|
145
|
+
typesVersion = await resolveTypesBunVersion(version);
|
|
146
|
+
if (typesVersion !== version) {
|
|
147
|
+
warn(`@types/bun ${version} is not published yet; using @types/bun ${typesVersion}`);
|
|
148
|
+
}
|
|
149
|
+
} catch (error) {
|
|
150
|
+
warn(`Could not resolve @types/bun metadata (${error instanceof Error ? error.message : "unknown error"}), defaulting to ${version}`);
|
|
151
|
+
}
|
|
91
152
|
writeFileSync(bunVersionFile, `${version}
|
|
92
153
|
`);
|
|
93
154
|
success("Updated .bun-version");
|
|
94
155
|
const packageFiles = findPackageJsonFiles(cwd);
|
|
156
|
+
info("Updating packageManager...");
|
|
157
|
+
for (const file of packageFiles) {
|
|
158
|
+
if (updatePackageManager(file, version)) {
|
|
159
|
+
log(` ${file.replace(`${cwd}/`, "")}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
95
162
|
info("Updating engines.bun...");
|
|
96
163
|
for (const file of packageFiles) {
|
|
97
164
|
if (updateEnginesBun(file, version)) {
|
|
@@ -100,7 +167,7 @@ async function runUpgradeBun(targetVersion, options = {}) {
|
|
|
100
167
|
}
|
|
101
168
|
info("Updating @types/bun...");
|
|
102
169
|
for (const file of packageFiles) {
|
|
103
|
-
if (updateTypesBun(file,
|
|
170
|
+
if (updateTypesBun(file, typesVersion)) {
|
|
104
171
|
log(` ${file.replace(`${cwd}/`, "")}`);
|
|
105
172
|
}
|
|
106
173
|
}
|
|
@@ -137,7 +204,7 @@ async function runUpgradeBun(targetVersion, options = {}) {
|
|
|
137
204
|
log("");
|
|
138
205
|
success("Done! Changes ready to commit:");
|
|
139
206
|
log(" - .bun-version");
|
|
140
|
-
log(" - package.json files (engines.bun, @types/bun)");
|
|
207
|
+
log(" - package.json files (packageManager, engines.bun, @types/bun)");
|
|
141
208
|
log(" - bun.lock");
|
|
142
209
|
log("");
|
|
143
210
|
log(`Commit with: git add -A && git commit -m 'chore: upgrade Bun to ${version}'`);
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Bun version compatibility helpers.
|
|
3
|
+
*
|
|
4
|
+
* @packageDocumentation
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Parsed semantic version components.
|
|
8
|
+
*/
|
|
9
|
+
interface ParsedSemver {
|
|
10
|
+
readonly major: number;
|
|
11
|
+
readonly minor: number;
|
|
12
|
+
readonly patch: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Parse a semver-like value into numeric components.
|
|
16
|
+
*
|
|
17
|
+
* Accepts standard versions like `1.3.10` and prerelease variants like
|
|
18
|
+
* `1.3.10-canary.1` by reading only the numeric major/minor/patch prefix.
|
|
19
|
+
*/
|
|
20
|
+
declare function parseSemver(version: string): ParsedSemver | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Whether a candidate `@types/bun` version is compatible with a target Bun version.
|
|
23
|
+
*
|
|
24
|
+
* Compatibility rule:
|
|
25
|
+
* - same major/minor
|
|
26
|
+
* - candidate patch <= Bun patch
|
|
27
|
+
*/
|
|
28
|
+
declare function isTypesBunVersionCompatible(bunVersion: string, bunTypesVersion: string): boolean;
|
|
29
|
+
export { ParsedSemver, parseSemver, isTypesBunVersionCompatible };
|
|
@@ -7,7 +7,7 @@ function extractBunupFilterName(script) {
|
|
|
7
7
|
}
|
|
8
8
|
function findUnregisteredPackages(packagesWithFilter, registeredNames) {
|
|
9
9
|
const registered = new Set(registeredNames);
|
|
10
|
-
const missing = packagesWithFilter.filter((name) => !registered.has(name)).
|
|
10
|
+
const missing = packagesWithFilter.filter((name) => !registered.has(name)).toSorted();
|
|
11
11
|
return {
|
|
12
12
|
ok: missing.length === 0,
|
|
13
13
|
missing
|
|
@@ -31,13 +31,15 @@ async function runCheckBunupRegistry() {
|
|
|
31
31
|
if (!Array.isArray(rawConfig)) {
|
|
32
32
|
process.stderr.write(`bunup.config.ts must export a workspace array
|
|
33
33
|
`);
|
|
34
|
-
process.
|
|
34
|
+
process.exitCode = 1;
|
|
35
|
+
return;
|
|
35
36
|
}
|
|
36
37
|
registeredNames = rawConfig.map((entry) => entry.name);
|
|
37
38
|
} catch {
|
|
38
39
|
process.stderr.write(`Could not load bunup.config.ts from ${cwd}
|
|
39
40
|
`);
|
|
40
|
-
process.
|
|
41
|
+
process.exitCode = 1;
|
|
42
|
+
return;
|
|
41
43
|
}
|
|
42
44
|
const packagesWithFilter = [];
|
|
43
45
|
const glob = new Bun.Glob("{packages,apps}/*/package.json");
|
|
@@ -58,7 +60,8 @@ async function runCheckBunupRegistry() {
|
|
|
58
60
|
if (result.ok) {
|
|
59
61
|
process.stdout.write(`${COLORS.green}All ${packagesWithFilter.length} packages with bunup --filter are registered in bunup.config.ts.${COLORS.reset}
|
|
60
62
|
`);
|
|
61
|
-
process.
|
|
63
|
+
process.exitCode = 0;
|
|
64
|
+
return;
|
|
62
65
|
}
|
|
63
66
|
process.stderr.write(`${COLORS.red}${result.missing.length} package(s) have bunup --filter build scripts but are not registered in bunup.config.ts:${COLORS.reset}
|
|
64
67
|
|
|
@@ -72,7 +75,7 @@ Add the missing entries to ${COLORS.blue}bunup.config.ts${COLORS.reset} defineWo
|
|
|
72
75
|
`);
|
|
73
76
|
process.stderr.write(`Without registration, ${COLORS.dim}bunup --filter <name>${COLORS.reset} silently exits with no output.
|
|
74
77
|
`);
|
|
75
|
-
process.
|
|
78
|
+
process.exitCode = 1;
|
|
76
79
|
}
|
|
77
80
|
|
|
78
81
|
export { extractBunupFilterName, findUnregisteredPackages, runCheckBunupRegistry };
|
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,132 +1,136 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
2
|
+
"name": "@outfitter/tooling",
|
|
3
|
+
"description": "Dev tooling configuration presets for Outfitter projects (oxlint/oxfmt, typescript, lefthook, markdownlint)",
|
|
4
|
+
"version": "0.3.4",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"files": [
|
|
7
|
+
"dist",
|
|
8
|
+
"registry",
|
|
9
|
+
"tsconfig.preset.json",
|
|
10
|
+
"tsconfig.preset.bun.json",
|
|
11
|
+
"lefthook.yml",
|
|
12
|
+
".markdownlint-cli2.jsonc"
|
|
13
|
+
],
|
|
14
|
+
"module": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"import": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"default": "./dist/index.js"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"./.markdownlint-cli2": "./.markdownlint-cli2.jsonc",
|
|
24
|
+
"./.markdownlint-cli2.jsonc": "./.markdownlint-cli2.jsonc",
|
|
25
|
+
"./cli/check": {
|
|
26
|
+
"import": {
|
|
27
|
+
"types": "./dist/cli/check.d.ts",
|
|
28
|
+
"default": "./dist/cli/check.js"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"./cli/check-markdown-links": {
|
|
32
|
+
"import": {
|
|
33
|
+
"types": "./dist/cli/check-markdown-links.d.ts",
|
|
34
|
+
"default": "./dist/cli/check-markdown-links.js"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"./cli/check-tsdoc": {
|
|
38
|
+
"import": {
|
|
39
|
+
"types": "./dist/cli/check-tsdoc.d.ts",
|
|
40
|
+
"default": "./dist/cli/check-tsdoc.js"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"./cli/fix": {
|
|
44
|
+
"import": {
|
|
45
|
+
"types": "./dist/cli/fix.d.ts",
|
|
46
|
+
"default": "./dist/cli/fix.js"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"./cli/init": {
|
|
50
|
+
"import": {
|
|
51
|
+
"types": "./dist/cli/init.d.ts",
|
|
52
|
+
"default": "./dist/cli/init.js"
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"./lefthook": "./lefthook.yml",
|
|
56
|
+
"./lefthook.yml": "./lefthook.yml",
|
|
57
|
+
"./package.json": "./package.json",
|
|
58
|
+
"./registry": {
|
|
59
|
+
"import": {
|
|
60
|
+
"types": "./dist/registry/index.d.ts",
|
|
61
|
+
"default": "./dist/registry/index.js"
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"./tsconfig": "./tsconfig.preset.json",
|
|
65
|
+
"./tsconfig-bun": "./tsconfig.preset.bun.json",
|
|
66
|
+
"./tsconfig.preset.bun.json": "./tsconfig.preset.bun.json",
|
|
67
|
+
"./tsconfig.preset.json": "./tsconfig.preset.json"
|
|
68
|
+
},
|
|
69
|
+
"bin": {
|
|
70
|
+
"tooling": "./dist/cli/index.js"
|
|
71
|
+
},
|
|
72
|
+
"sideEffects": false,
|
|
73
|
+
"scripts": {
|
|
74
|
+
"build:registry": "bun run src/registry/build.ts",
|
|
75
|
+
"sync:exports": "bun run scripts/sync-exports.ts",
|
|
76
|
+
"sync:exports:check": "bun run scripts/sync-exports.ts --check",
|
|
77
|
+
"build": "bun run build:registry && bun run sync:exports:check && cd ../.. && bunup --filter @outfitter/tooling",
|
|
78
|
+
"prepack": "bun run sync:exports",
|
|
79
|
+
"lint": "oxlint ./src",
|
|
80
|
+
"lint:fix": "oxlint --fix ./src",
|
|
81
|
+
"test": "bun run build:registry && bun test",
|
|
82
|
+
"typecheck": "tsc --noEmit",
|
|
83
|
+
"clean": "rm -rf dist registry",
|
|
84
|
+
"prepublishOnly": "bun ../../scripts/check-publish-manifest.ts"
|
|
85
|
+
},
|
|
86
|
+
"dependencies": {
|
|
87
|
+
"@outfitter/cli": "0.5.3",
|
|
88
|
+
"commander": "^14.0.2",
|
|
89
|
+
"typescript": "^5.9.3",
|
|
90
|
+
"zod": "^4.3.5"
|
|
91
|
+
},
|
|
92
|
+
"devDependencies": {
|
|
93
|
+
"@outfitter/presets": "0.2.1",
|
|
94
|
+
"@types/bun": "^1.3.9",
|
|
95
|
+
"yaml": "^2.8.2"
|
|
96
|
+
},
|
|
97
|
+
"peerDependencies": {
|
|
98
|
+
"ultracite": "^7.0.0",
|
|
99
|
+
"lefthook": "^2.0.0",
|
|
100
|
+
"markdownlint-cli2": ">=0.17.0"
|
|
101
|
+
},
|
|
102
|
+
"peerDependenciesMeta": {
|
|
103
|
+
"ultracite": {
|
|
104
|
+
"optional": true
|
|
105
|
+
},
|
|
106
|
+
"lefthook": {
|
|
107
|
+
"optional": true
|
|
108
|
+
},
|
|
109
|
+
"markdownlint-cli2": {
|
|
110
|
+
"optional": true
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
"engines": {
|
|
114
|
+
"bun": ">=1.3.10"
|
|
115
|
+
},
|
|
116
|
+
"keywords": [
|
|
117
|
+
"outfitter",
|
|
118
|
+
"tooling",
|
|
119
|
+
"oxlint",
|
|
120
|
+
"oxfmt",
|
|
121
|
+
"typescript",
|
|
122
|
+
"lefthook",
|
|
123
|
+
"markdownlint",
|
|
124
|
+
"config",
|
|
125
|
+
"presets"
|
|
126
|
+
],
|
|
127
|
+
"license": "MIT",
|
|
128
|
+
"repository": {
|
|
129
|
+
"type": "git",
|
|
130
|
+
"url": "https://github.com/outfitter-dev/outfitter.git",
|
|
131
|
+
"directory": "packages/tooling"
|
|
132
|
+
},
|
|
133
|
+
"publishConfig": {
|
|
134
|
+
"access": "public"
|
|
135
|
+
}
|
|
132
136
|
}
|
package/registry/registry.json
CHANGED
|
@@ -16,17 +16,24 @@
|
|
|
16
16
|
}
|
|
17
17
|
]
|
|
18
18
|
},
|
|
19
|
-
"
|
|
20
|
-
"name": "
|
|
21
|
-
"description": "
|
|
19
|
+
"linter": {
|
|
20
|
+
"name": "linter",
|
|
21
|
+
"description": "Linter and formatter configuration (oxlint/oxfmt) via Ultracite",
|
|
22
22
|
"files": [
|
|
23
23
|
{
|
|
24
|
-
"path": "
|
|
25
|
-
"content": "{\n\
|
|
24
|
+
"path": ".oxlintrc.json",
|
|
25
|
+
"content": "{\n \"$schema\": \"./node_modules/oxlint/configuration_schema.json\",\n \"plugins\": [\"eslint\"],\n \"jsPlugins\": [\n {\n \"name\": \"outfitter\",\n \"specifier\": \"@outfitter/oxlint-plugin\"\n }\n ],\n \"globals\": { \"Bun\": \"readonly\" },\n \"categories\": {\n \"correctness\": \"error\",\n \"suspicious\": \"error\",\n \"pedantic\": \"off\",\n \"perf\": \"off\",\n \"style\": \"off\",\n \"restriction\": \"off\"\n },\n \"ignorePatterns\": [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \"**/.turbo/**\",\n \"**/*.gen.ts\"\n ],\n \"rules\": {\n \"no-void\": \"off\",\n \"outfitter/action-must-register\": \"warn\",\n \"outfitter/handler-must-return-result\": \"error\",\n \"outfitter/max-file-lines\": [\"error\", { \"warn\": 200, \"error\": 400 }],\n \"outfitter/no-console-in-packages\": \"error\",\n \"outfitter/no-cross-tier-import\": \"error\",\n \"outfitter/no-deep-relative-import\": \"warn\",\n \"outfitter/no-nested-barrel\": \"warn\",\n \"outfitter/no-process-env-in-packages\": \"warn\",\n \"outfitter/no-process-exit-in-packages\": \"error\",\n \"outfitter/no-throw-in-handler\": \"error\",\n \"outfitter/prefer-bun-api\": \"warn\",\n \"outfitter/snapshot-location\": \"warn\",\n \"outfitter/test-file-naming\": \"warn\",\n \"outfitter/use-error-taxonomy\": \"warn\"\n }\n}\n"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"path": ".oxfmtrc.jsonc",
|
|
29
|
+
"content": "{\n \"$schema\": \"./node_modules/oxfmt/configuration_schema.json\",\n \"printWidth\": 80,\n \"tabWidth\": 2,\n \"useTabs\": false,\n \"semi\": true,\n \"singleQuote\": false,\n \"quoteProps\": \"as-needed\",\n \"jsxSingleQuote\": false,\n \"trailingComma\": \"es5\",\n \"bracketSpacing\": true,\n \"bracketSameLine\": false,\n \"arrowParens\": \"always\",\n \"endOfLine\": \"lf\",\n \"experimentalSortImports\": {\n \"ignoreCase\": true,\n \"newlinesBetween\": true,\n \"order\": \"asc\",\n },\n}\n"
|
|
26
30
|
}
|
|
27
31
|
],
|
|
28
32
|
"devDependencies": {
|
|
29
|
-
"
|
|
33
|
+
"@outfitter/oxlint-plugin": "^0.1.0",
|
|
34
|
+
"ultracite": "7.2.3",
|
|
35
|
+
"oxlint": "1.50.0",
|
|
36
|
+
"oxfmt": "0.35.0"
|
|
30
37
|
}
|
|
31
38
|
},
|
|
32
39
|
"lefthook": {
|
|
@@ -39,9 +46,9 @@
|
|
|
39
46
|
}
|
|
40
47
|
],
|
|
41
48
|
"devDependencies": {
|
|
42
|
-
"@outfitter/tooling": "^0.
|
|
49
|
+
"@outfitter/tooling": "^0.3.4",
|
|
43
50
|
"lefthook": "^2.1.1",
|
|
44
|
-
"ultracite": "
|
|
51
|
+
"ultracite": "7.2.3"
|
|
45
52
|
}
|
|
46
53
|
},
|
|
47
54
|
"markdownlint": {
|
|
@@ -50,7 +57,7 @@
|
|
|
50
57
|
"files": [
|
|
51
58
|
{
|
|
52
59
|
"path": ".markdownlint-cli2.jsonc",
|
|
53
|
-
"content": "{\n
|
|
60
|
+
"content": "{\n // Outfitter markdownlint preset\n // https://github.com/DavidAnson/markdownlint\n\n \"config\": {\n // Headings\n \"MD003\": { \"style\": \"atx\" }, // ATX-style headings (# Heading)\n \"MD022\": { \"lines_above\": 1, \"lines_below\": 1 }, // Blank lines around headings\n \"MD024\": { \"siblings_only\": true }, // Allow duplicate headings in different sections\n \"MD041\": false, // First line doesn't need to be h1 (frontmatter, etc.)\n\n // Line length - disabled for prose flexibility\n \"MD013\": false,\n\n // Lists\n \"MD004\": { \"style\": \"dash\" }, // Unordered list style: dash (-)\n \"MD007\": { \"indent\": 2 }, // List indentation: 2 spaces\n \"MD032\": true, // Blank lines around lists\n\n // Code blocks\n \"MD040\": true, // Fenced code blocks should have a language\n \"MD046\": { \"style\": \"fenced\" }, // Code block style: fenced (```)\n \"MD048\": { \"style\": \"backtick\" }, // Code fence style: backticks\n\n // Links\n \"MD034\": true, // No bare URLs (use <url> or [text](url))\n\n // Whitespace\n \"MD009\": { \"br_spaces\": 2 }, // Allow 2 trailing spaces for <br>\n \"MD010\": { \"spaces_per_tab\": 2 }, // Tabs to spaces\n \"MD012\": { \"maximum\": 1 }, // Max 1 consecutive blank line\n \"MD047\": true, // Files should end with newline\n\n // HTML - allow for GitHub-specific elements\n \"MD033\": {\n \"allowed_elements\": [\n \"details\",\n \"summary\",\n \"kbd\",\n \"br\",\n \"sup\",\n \"sub\",\n \"img\",\n \"picture\",\n \"source\",\n \"a\",\n ],\n },\n\n // Emphasis\n \"MD049\": { \"style\": \"asterisk\" }, // Emphasis style: *italic*\n \"MD050\": { \"style\": \"asterisk\" }, // Strong style: **bold**\n },\n\n // Ignore patterns\n \"ignores\": [\n \"node_modules/**\",\n \"**/node_modules/**\",\n \"dist/**\",\n \"**/dist/**\",\n \".turbo/**\",\n \"**/.turbo/**\",\n \"CHANGELOG.md\",\n \"**/CHANGELOG.md\",\n ],\n}\n"
|
|
54
61
|
}
|
|
55
62
|
]
|
|
56
63
|
},
|
|
@@ -67,10 +74,10 @@
|
|
|
67
74
|
},
|
|
68
75
|
"scaffolding": {
|
|
69
76
|
"name": "scaffolding",
|
|
70
|
-
"description": "Full starter kit: Claude settings,
|
|
77
|
+
"description": "Full starter kit: Claude settings, oxlint/oxfmt, Lefthook, markdownlint, and bootstrap script",
|
|
71
78
|
"extends": [
|
|
72
79
|
"claude",
|
|
73
|
-
"
|
|
80
|
+
"linter",
|
|
74
81
|
"lefthook",
|
|
75
82
|
"markdownlint",
|
|
76
83
|
"bootstrap"
|
package/tsconfig.preset.bun.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
"$schema": "https://json.schemastore.org/tsconfig",
|
|
3
|
+
"extends": "./tsconfig.preset.json",
|
|
4
|
+
"compilerOptions": {
|
|
5
|
+
"types": ["@types/bun"]
|
|
6
|
+
}
|
|
7
7
|
}
|