skyltmax_config 0.0.12.pre.28b460b.pre.08ae59c → 0.0.13.beta.1
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.
- checksums.yaml +4 -4
- data/AGENTS.md +12 -12
- data/CHANGELOG.md +4 -0
- data/Gemfile.lock +3 -3
- data/README.md +11 -11
- data/fixture/eslint.config.js +2 -2
- data/fixture/package.json +4 -4
- data/fixture/pnpm-lock.yaml +15 -4
- data/fixture/tsconfig.json +1 -1
- data/lib/skyltmax_config/version.rb +1 -1
- data/package.json +2 -2
- data/scripts/peer-deps/audit.js +3 -3
- data/scripts/peer-deps/install.js +51 -21
- data/skyltmax_config.gemspec +3 -4
- data/tests/check-peers.test.js +1 -1
- data/tests/install-peers.test.js +38 -2
- metadata +2 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f7a611d823cb4ca17672eb3c9a86b8ee44cda990ed76aa1d4f14f8757668e701
|
|
4
|
+
data.tar.gz: 354e2b31fe00a20c1c0ba9d85a87c1e0e037a2cf5cfb0ec347a77b8ee28a29b9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 54c5d52683b80724edd68cc8f56b00cf8bd368cdb4a15147dd7b280d5043a3b9ce5df5ac4264d57d8a7d112a7996a64532e75baad8470d056c69c05e5db96a22
|
|
7
|
+
data.tar.gz: 4474894cd47617dc80c4775f5dc62fe7d266fbdcf86f7871a959684dcae4e2ac207476b19eb07b25a9911464922f573d3289abf474a848b08d4a5e531df44cf5
|
data/AGENTS.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# AI Agent Guide for @
|
|
1
|
+
# AI Agent Guide for @skyltmax/config
|
|
2
2
|
|
|
3
|
-
This document provides comprehensive guidance for AI coding agents working with the `@
|
|
3
|
+
This document provides comprehensive guidance for AI coding agents working with the `@skyltmax/config` package.
|
|
4
4
|
|
|
5
5
|
## Table of Contents
|
|
6
6
|
|
|
@@ -64,7 +64,7 @@ This is a **dual-language configuration package** providing ESLint, Prettier, an
|
|
|
64
64
|
JavaScript/TypeScript projects, and Rubocop configs for Ruby projects:
|
|
65
65
|
|
|
66
66
|
```
|
|
67
|
-
@
|
|
67
|
+
@skyltmax/config/
|
|
68
68
|
├── lib/
|
|
69
69
|
│ └── skyltmax_config.rb # Ruby gem entry point
|
|
70
70
|
├── eslint.js # ESLint configuration
|
|
@@ -125,9 +125,9 @@ JavaScript/TypeScript projects, and Rubocop configs for Ruby projects:
|
|
|
125
125
|
**For JavaScript/TypeScript projects:**
|
|
126
126
|
|
|
127
127
|
```bash
|
|
128
|
-
npm install --save-dev @
|
|
128
|
+
npm install --save-dev @skyltmax/config
|
|
129
129
|
# or
|
|
130
|
-
pnpm add -D @
|
|
130
|
+
pnpm add -D @skyltmax/config
|
|
131
131
|
```
|
|
132
132
|
|
|
133
133
|
**That's it!** All required tools (ESLint, Prettier, TypeScript, and all plugins) are bundled as dependencies. No need
|
|
@@ -146,7 +146,7 @@ gem "skyltmax_config"
|
|
|
146
146
|
|
|
147
147
|
```javascript
|
|
148
148
|
// eslint.config.js
|
|
149
|
-
import { config as defaultConfig } from "@
|
|
149
|
+
import { config as defaultConfig } from "@skyltmax/config/eslint"
|
|
150
150
|
|
|
151
151
|
/** @type {import("eslint").Linter.Config[]} */
|
|
152
152
|
export default [...defaultConfig]
|
|
@@ -157,7 +157,7 @@ export default [...defaultConfig]
|
|
|
157
157
|
```json
|
|
158
158
|
// package.json
|
|
159
159
|
{
|
|
160
|
-
"prettier": "@
|
|
160
|
+
"prettier": "@skyltmax/config/prettier"
|
|
161
161
|
}
|
|
162
162
|
```
|
|
163
163
|
|
|
@@ -166,7 +166,7 @@ export default [...defaultConfig]
|
|
|
166
166
|
```json
|
|
167
167
|
// tsconfig.json
|
|
168
168
|
{
|
|
169
|
-
"extends": ["@
|
|
169
|
+
"extends": ["@skyltmax/config/typescript"],
|
|
170
170
|
"include": ["**/*.ts", "**/*.tsx"],
|
|
171
171
|
"compilerOptions": {
|
|
172
172
|
"paths": {
|
|
@@ -431,7 +431,7 @@ When modifying configurations:
|
|
|
431
431
|
- Document breaking changes in CHANGELOG
|
|
432
432
|
|
|
433
433
|
3. **Validate exports:**
|
|
434
|
-
- Ensure all exports work: `import { config } from "@
|
|
434
|
+
- Ensure all exports work: `import { config } from "@skyltmax/config/eslint"`
|
|
435
435
|
- Check both named and default exports
|
|
436
436
|
- Verify TypeScript definitions are correct
|
|
437
437
|
|
|
@@ -487,7 +487,7 @@ configurations, which ensures the configs are functional and catches issues earl
|
|
|
487
487
|
|
|
488
488
|
This package uses a dual-publishing approach:
|
|
489
489
|
|
|
490
|
-
**NPM Package (`@
|
|
490
|
+
**NPM Package (`@skyltmax/config`):**
|
|
491
491
|
|
|
492
492
|
- Main entry: `index.js`
|
|
493
493
|
- Exports: `./prettier`, `./typescript`, `./eslint`, `./reset.d.ts`
|
|
@@ -507,7 +507,7 @@ This package uses **peer dependencies** to provide all required tooling while en
|
|
|
507
507
|
|
|
508
508
|
1. **Editor Discovery:** Tools like VSCode, WebStorm, and others look for `prettier`, `eslint`, and `typescript` in the
|
|
509
509
|
project's root `node_modules`. When bundled as regular dependencies, they end up in
|
|
510
|
-
`node_modules/@
|
|
510
|
+
`node_modules/@skyltmax/config/node_modules`, which editors cannot find.
|
|
511
511
|
|
|
512
512
|
2. **Automatic Installation:** Modern package managers with `autoInstallPeers` enabled (pnpm's default, npm 7+
|
|
513
513
|
configurable) automatically install peer dependencies, so users get a "single install" experience.
|
|
@@ -539,7 +539,7 @@ This package uses **peer dependencies** to provide all required tooling while en
|
|
|
539
539
|
**Benefits:**
|
|
540
540
|
|
|
541
541
|
- ✅ **Version control:** Consuming projects get consistent, tested versions
|
|
542
|
-
- ✅ **Simplified setup:** Single `npm install @
|
|
542
|
+
- ✅ **Simplified setup:** Single `npm install @skyltmax/config` gets everything (with autoInstallPeers enabled)
|
|
543
543
|
- ✅ **No version conflicts:** This package manages compatibility between tools
|
|
544
544
|
- ✅ **Updates centralized:** Bump versions here, all projects benefit
|
|
545
545
|
- ✅ **Editor compatibility:** Tools are hoisted to root `node_modules/` for VSCode, WebStorm, etc.
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
skyltmax_config (0.0.
|
|
4
|
+
skyltmax_config (0.0.13.beta.1)
|
|
5
5
|
rubocop (>= 1.81.0, < 2)
|
|
6
6
|
rubocop-performance (>= 1.26.0, < 2)
|
|
7
7
|
rubocop-rails (>= 2.33.0, < 3)
|
|
@@ -34,7 +34,7 @@ GEM
|
|
|
34
34
|
language_server-protocol (3.17.0.5)
|
|
35
35
|
lint_roller (1.1.0)
|
|
36
36
|
logger (1.7.0)
|
|
37
|
-
minitest (5.
|
|
37
|
+
minitest (5.27.0)
|
|
38
38
|
parallel (1.27.0)
|
|
39
39
|
parser (3.3.9.0)
|
|
40
40
|
ast (~> 2.4.1)
|
|
@@ -75,7 +75,7 @@ GEM
|
|
|
75
75
|
concurrent-ruby (~> 1.0)
|
|
76
76
|
unicode-display_width (3.1.4)
|
|
77
77
|
unicode-emoji (~> 4.0, >= 4.0.4)
|
|
78
|
-
unicode-emoji (4.0
|
|
78
|
+
unicode-emoji (4.2.0)
|
|
79
79
|
uri (1.1.1)
|
|
80
80
|
|
|
81
81
|
PLATFORMS
|
data/README.md
CHANGED
|
@@ -11,16 +11,16 @@ Based on <a href="https://github.com/epicweb-dev/config">@epic-web/config</a>.
|
|
|
11
11
|
### JavaScript/TypeScript
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
|
-
npm install --save-dev @
|
|
14
|
+
npm install --save-dev @skyltmax/config
|
|
15
15
|
# or
|
|
16
|
-
pnpm add -D @
|
|
16
|
+
pnpm add -D @skyltmax/config
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
Once the package is in place, sync the tooling versions we pin:
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
npx
|
|
23
|
-
npx
|
|
22
|
+
npx skyltmax-config-peers --dry-run # inspect the command (optional)
|
|
23
|
+
npx skyltmax-config-peers
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
The helper installs the exact ESLint, Prettier, TypeScript, and plugin versions we dogfood with. It currently supports
|
|
@@ -28,7 +28,7 @@ The helper installs the exact ESLint, Prettier, TypeScript, and plugin versions
|
|
|
28
28
|
[`peerDependencies`](package.json) with the version locked there.
|
|
29
29
|
|
|
30
30
|
> After installation the package runs a lightweight audit and will warn if any peer is missing or pinned to a different
|
|
31
|
-
> version. When that happens, rerun `npx
|
|
31
|
+
> version. When that happens, rerun `npx skyltmax-config-peers` to sync everything.
|
|
32
32
|
|
|
33
33
|
### Ruby
|
|
34
34
|
|
|
@@ -56,7 +56,7 @@ inherit_gem:
|
|
|
56
56
|
The easiest way to use this config is in your `package.json`:
|
|
57
57
|
|
|
58
58
|
```json
|
|
59
|
-
"prettier": "@
|
|
59
|
+
"prettier": "@skyltmax/config/prettier"
|
|
60
60
|
```
|
|
61
61
|
|
|
62
62
|
<details>
|
|
@@ -68,7 +68,7 @@ can override it using regular JavaScript stuff.
|
|
|
68
68
|
Create a `.prettierrc.js` file in your project root with the following content:
|
|
69
69
|
|
|
70
70
|
```js
|
|
71
|
-
import defaultConfig from "
|
|
71
|
+
import defaultConfig from "skyltmax/config/prettier"
|
|
72
72
|
|
|
73
73
|
/** @type {import("prettier").Options} */
|
|
74
74
|
export default {
|
|
@@ -85,7 +85,7 @@ Create a `tsconfig.json` file in your project root with the following content:
|
|
|
85
85
|
|
|
86
86
|
```json
|
|
87
87
|
{
|
|
88
|
-
"extends": ["@
|
|
88
|
+
"extends": ["@skyltmax/config/typescript"],
|
|
89
89
|
"include": ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx"],
|
|
90
90
|
"compilerOptions": {
|
|
91
91
|
"paths": {
|
|
@@ -99,7 +99,7 @@ Create a `tsconfig.json` file in your project root with the following content:
|
|
|
99
99
|
Create a `reset.d.ts` file in your project with these contents:
|
|
100
100
|
|
|
101
101
|
```typescript
|
|
102
|
-
import "@
|
|
102
|
+
import "@skyltmax/config/reset.d.ts"
|
|
103
103
|
```
|
|
104
104
|
|
|
105
105
|
<details>
|
|
@@ -114,7 +114,7 @@ Learn more from [the TypeScript docs here](https://www.typescriptlang.org/tsconf
|
|
|
114
114
|
Create a `eslint.config.js` file in your project root with the following content:
|
|
115
115
|
|
|
116
116
|
```js
|
|
117
|
-
import { config as defaultConfig } from "@
|
|
117
|
+
import { config as defaultConfig } from "@skyltmax/config/eslint"
|
|
118
118
|
|
|
119
119
|
/** @type {import("eslint").Linter.Config[]} */
|
|
120
120
|
export default [...defaultConfig]
|
|
@@ -134,7 +134,7 @@ positives.
|
|
|
134
134
|
|
|
135
135
|
## Publishing
|
|
136
136
|
|
|
137
|
-
This repo publishes a Ruby gem (skyltmax_config) and an npm package (@
|
|
137
|
+
This repo publishes a Ruby gem (skyltmax_config) and an npm package (@skyltmax/config) whenever a GitHub Release is
|
|
138
138
|
published. A manual run is also available.
|
|
139
139
|
|
|
140
140
|
Setup (one-time):
|
data/fixture/eslint.config.js
CHANGED
data/fixture/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "@
|
|
2
|
+
"name": "@skyltmax/fake-library",
|
|
3
3
|
"version": "0.0.0",
|
|
4
4
|
"private": true,
|
|
5
|
-
"description": "Fixture project for exercising @
|
|
5
|
+
"description": "Fixture project for exercising @skyltmax/config in CI.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"engines": {
|
|
8
8
|
"node": ">=20.0.0"
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"typecheck": "tsc --noEmit"
|
|
14
14
|
},
|
|
15
15
|
"devDependencies": {
|
|
16
|
-
"@
|
|
16
|
+
"@skyltmax/config": "file:.."
|
|
17
17
|
},
|
|
18
|
-
"prettier": "@
|
|
18
|
+
"prettier": "@skyltmax/config/prettier"
|
|
19
19
|
}
|
data/fixture/pnpm-lock.yaml
CHANGED
|
@@ -8,9 +8,9 @@ importers:
|
|
|
8
8
|
|
|
9
9
|
.:
|
|
10
10
|
devDependencies:
|
|
11
|
-
'@
|
|
11
|
+
'@skyltmax/config':
|
|
12
12
|
specifier: file:..
|
|
13
|
-
version: file:..(
|
|
13
|
+
version: file:..(6601ab0a63db210ed54fc871c5d3405a)
|
|
14
14
|
|
|
15
15
|
packages:
|
|
16
16
|
|
|
@@ -191,7 +191,7 @@ packages:
|
|
|
191
191
|
resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==}
|
|
192
192
|
engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
|
|
193
193
|
|
|
194
|
-
'@
|
|
194
|
+
'@skyltmax/config@file:..':
|
|
195
195
|
resolution: {directory: .., type: directory}
|
|
196
196
|
engines: {node: '>=20.0.0'}
|
|
197
197
|
hasBin: true
|
|
@@ -213,6 +213,7 @@ packages:
|
|
|
213
213
|
eslint-plugin-testing-library: 7.13.3
|
|
214
214
|
globals: 16.5.0
|
|
215
215
|
prettier: 3.6.2
|
|
216
|
+
prettier-plugin-ignored: 1.0.0
|
|
216
217
|
prettier-plugin-tailwindcss: 0.7.1
|
|
217
218
|
tslib: 2.8.1
|
|
218
219
|
typescript: 5.9.3
|
|
@@ -1179,6 +1180,11 @@ packages:
|
|
|
1179
1180
|
resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
|
|
1180
1181
|
engines: {node: '>=6.0.0'}
|
|
1181
1182
|
|
|
1183
|
+
prettier-plugin-ignored@1.0.0:
|
|
1184
|
+
resolution: {integrity: sha512-q0wSUvUfHqg2cZ5SADkqnGK9Cv5bBn/ootjwDWAQ+8qE/iN1nklT3XHSaF6duRl6j0P4Ew70r0vAJkGZrn4/+w==}
|
|
1185
|
+
peerDependencies:
|
|
1186
|
+
prettier: 3.x
|
|
1187
|
+
|
|
1182
1188
|
prettier-plugin-tailwindcss@0.7.1:
|
|
1183
1189
|
resolution: {integrity: sha512-Bzv1LZcuiR1Sk02iJTS1QzlFNp/o5l2p3xkopwOrbPmtMeh3fK9rVW5M3neBQzHq+kGKj/4LGQMTNcTH4NGPtQ==}
|
|
1184
1190
|
engines: {node: '>=20.19'}
|
|
@@ -1711,7 +1717,7 @@ snapshots:
|
|
|
1711
1717
|
|
|
1712
1718
|
'@pkgr/core@0.2.9': {}
|
|
1713
1719
|
|
|
1714
|
-
'@
|
|
1720
|
+
'@skyltmax/config@file:..(6601ab0a63db210ed54fc871c5d3405a)':
|
|
1715
1721
|
dependencies:
|
|
1716
1722
|
'@eslint/js': 9.39.1
|
|
1717
1723
|
'@total-typescript/ts-reset': 0.6.1
|
|
@@ -1730,6 +1736,7 @@ snapshots:
|
|
|
1730
1736
|
eslint-plugin-testing-library: 7.13.3(eslint@9.39.1)(typescript@5.9.3)
|
|
1731
1737
|
globals: 16.5.0
|
|
1732
1738
|
prettier: 3.6.2
|
|
1739
|
+
prettier-plugin-ignored: 1.0.0(prettier@3.6.2)
|
|
1733
1740
|
prettier-plugin-tailwindcss: 0.7.1(prettier@3.6.2)
|
|
1734
1741
|
tslib: 2.8.1
|
|
1735
1742
|
typescript: 5.9.3
|
|
@@ -2832,6 +2839,10 @@ snapshots:
|
|
|
2832
2839
|
dependencies:
|
|
2833
2840
|
fast-diff: 1.3.0
|
|
2834
2841
|
|
|
2842
|
+
prettier-plugin-ignored@1.0.0(prettier@3.6.2):
|
|
2843
|
+
dependencies:
|
|
2844
|
+
prettier: 3.6.2
|
|
2845
|
+
|
|
2835
2846
|
prettier-plugin-tailwindcss@0.7.1(prettier@3.6.2):
|
|
2836
2847
|
dependencies:
|
|
2837
2848
|
prettier: 3.6.2
|
data/fixture/tsconfig.json
CHANGED
data/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@signmax/config",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.13",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"./eslint": "./eslint.js"
|
|
34
34
|
},
|
|
35
35
|
"bin": {
|
|
36
|
-
"
|
|
36
|
+
"skyltmax-config-peers": "./scripts/peer-deps/install.js"
|
|
37
37
|
},
|
|
38
38
|
"files": [
|
|
39
39
|
"*.js",
|
data/scripts/peer-deps/audit.js
CHANGED
|
@@ -76,7 +76,7 @@ export function formatAuditMessage({ missing, mismatched }) {
|
|
|
76
76
|
return null
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
const lines = ["[
|
|
79
|
+
const lines = ["[skyltmax-config] Peer dependency check detected issues:"]
|
|
80
80
|
|
|
81
81
|
if (missing.length) {
|
|
82
82
|
lines.push(" Missing peers:")
|
|
@@ -93,7 +93,7 @@ export function formatAuditMessage({ missing, mismatched }) {
|
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
lines.push(' Run "npx
|
|
96
|
+
lines.push(' Run "npx skyltmax-config-peers" to install the correct versions.')
|
|
97
97
|
|
|
98
98
|
return lines.join("\n")
|
|
99
99
|
}
|
|
@@ -107,7 +107,7 @@ export async function runPostinstallAudit() {
|
|
|
107
107
|
console.warn(message)
|
|
108
108
|
}
|
|
109
109
|
} catch (error) {
|
|
110
|
-
console.warn(`[
|
|
110
|
+
console.warn(`[skyltmax-config] Peer dependency check skipped: ${error.message}`)
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
113
|
|
|
@@ -5,7 +5,7 @@ import { readFile } from "node:fs/promises"
|
|
|
5
5
|
import { dirname, resolve } from "node:path"
|
|
6
6
|
import { fileURLToPath } from "node:url"
|
|
7
7
|
|
|
8
|
-
const HELP = `Usage:
|
|
8
|
+
const HELP = `Usage: skyltmax-config-peers [options]
|
|
9
9
|
|
|
10
10
|
Options:
|
|
11
11
|
--manager <name> npm | pnpm | bun (auto-detected by default)
|
|
@@ -37,34 +37,62 @@ export function detectManager({ managerArg, userAgent = "", cwd = process.cwd()
|
|
|
37
37
|
return "npm"
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
export function
|
|
40
|
+
export function findPnpmWorkspaceRoot(startDir) {
|
|
41
|
+
let current = resolve(startDir)
|
|
42
|
+
|
|
43
|
+
while (true) {
|
|
44
|
+
if (existsSync(resolve(current, "pnpm-workspace.yaml")) || existsSync(resolve(current, "pnpm-workspace.yml"))) {
|
|
45
|
+
return current
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const parent = dirname(current)
|
|
49
|
+
|
|
50
|
+
if (parent === current) {
|
|
51
|
+
return undefined
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
current = parent
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function buildInstallCommand(manager, packages, { cwd = process.cwd() } = {}) {
|
|
41
59
|
if (!packages.length) {
|
|
42
60
|
throw new Error("No peer dependencies to install.")
|
|
43
61
|
}
|
|
44
62
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
63
|
+
if (manager === "pnpm") {
|
|
64
|
+
const workspaceRoot = findPnpmWorkspaceRoot(cwd)
|
|
65
|
+
const args = ["add", "-D", "--save-exact", ...packages]
|
|
66
|
+
|
|
67
|
+
if (workspaceRoot) {
|
|
68
|
+
args.splice(2, 0, "-w")
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return {
|
|
51
72
|
command: "pnpm",
|
|
52
|
-
args
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
command: "bun",
|
|
56
|
-
args: ["add", "--dev", "--exact", ...packages],
|
|
57
|
-
},
|
|
73
|
+
args,
|
|
74
|
+
cwd: workspaceRoot ?? cwd,
|
|
75
|
+
}
|
|
58
76
|
}
|
|
59
77
|
|
|
60
|
-
|
|
78
|
+
if (manager === "npm") {
|
|
79
|
+
return {
|
|
80
|
+
command: "npm",
|
|
81
|
+
args: ["install", "--save-dev", "--save-exact", ...packages],
|
|
82
|
+
cwd,
|
|
83
|
+
}
|
|
84
|
+
}
|
|
61
85
|
|
|
62
|
-
if (
|
|
63
|
-
|
|
64
|
-
|
|
86
|
+
if (manager === "bun") {
|
|
87
|
+
return {
|
|
88
|
+
command: "bun",
|
|
89
|
+
args: ["add", "--dev", "--exact", ...packages],
|
|
90
|
+
cwd,
|
|
91
|
+
}
|
|
65
92
|
}
|
|
66
93
|
|
|
67
|
-
|
|
94
|
+
const supported = "npm, pnpm, bun"
|
|
95
|
+
throw new Error(`Unsupported package manager: ${manager}. Supported managers: ${supported}`)
|
|
68
96
|
}
|
|
69
97
|
|
|
70
98
|
export function formatCommand({ command, args }) {
|
|
@@ -84,13 +112,14 @@ export async function prepareInstall({
|
|
|
84
112
|
}
|
|
85
113
|
|
|
86
114
|
const manager = detectManager({ managerArg, userAgent: env.npm_config_user_agent ?? "", cwd })
|
|
87
|
-
const command = buildInstallCommand(manager, packages)
|
|
115
|
+
const command = buildInstallCommand(manager, packages, { cwd })
|
|
88
116
|
|
|
89
117
|
return {
|
|
90
118
|
manager,
|
|
91
119
|
packages,
|
|
92
120
|
command: command.command,
|
|
93
121
|
args: command.args,
|
|
122
|
+
cwd: command.cwd ?? cwd,
|
|
94
123
|
printable: formatCommand(command),
|
|
95
124
|
}
|
|
96
125
|
}
|
|
@@ -114,7 +143,7 @@ export async function runCli({ args = process.argv.slice(2), env = process.env,
|
|
|
114
143
|
const result = await prepareInstall({ managerArg, cwd, env })
|
|
115
144
|
|
|
116
145
|
if (!result.packages || result.packages.length === 0) {
|
|
117
|
-
process.stdout.write("No peer dependencies found on @
|
|
146
|
+
process.stdout.write("No peer dependencies found on @skyltmax/config.\n")
|
|
118
147
|
return 0
|
|
119
148
|
}
|
|
120
149
|
|
|
@@ -127,6 +156,7 @@ export async function runCli({ args = process.argv.slice(2), env = process.env,
|
|
|
127
156
|
|
|
128
157
|
const child = spawn(result.command, result.args, {
|
|
129
158
|
stdio: "inherit",
|
|
159
|
+
cwd: result.cwd,
|
|
130
160
|
})
|
|
131
161
|
|
|
132
162
|
return await new Promise((resolve, reject) => {
|
data/skyltmax_config.gemspec
CHANGED
|
@@ -18,10 +18,9 @@ Gem::Specification.new do |s|
|
|
|
18
18
|
s.license = "MIT"
|
|
19
19
|
|
|
20
20
|
s.metadata = {
|
|
21
|
-
"homepage_uri"
|
|
22
|
-
"source_code_uri"
|
|
23
|
-
"bug_tracker_uri"
|
|
24
|
-
"allowed_push_host" => "https://rubygems.org",
|
|
21
|
+
"homepage_uri" => "https://github.com/skyltmax/config#readme",
|
|
22
|
+
"source_code_uri" => "https://github.com/skyltmax/config",
|
|
23
|
+
"bug_tracker_uri" => "https://github.com/skyltmax/config/issues",
|
|
25
24
|
}
|
|
26
25
|
|
|
27
26
|
# include all tracked files so packaged gem mirrors the repo's config assets
|
data/tests/check-peers.test.js
CHANGED
|
@@ -16,7 +16,7 @@ async function createPackage(root, name, version) {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
async function createProjectRoot() {
|
|
19
|
-
const root = await mkdtemp(join(tmpdir(), "
|
|
19
|
+
const root = await mkdtemp(join(tmpdir(), "skyltmax-check-peers-"))
|
|
20
20
|
await writeFile(join(root, "package.json"), JSON.stringify({ name: "example", version: "1.0.0" }), "utf8")
|
|
21
21
|
return root
|
|
22
22
|
}
|
data/tests/install-peers.test.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mkdtemp, writeFile } from "node:fs/promises"
|
|
1
|
+
import { mkdir, mkdtemp, writeFile } from "node:fs/promises"
|
|
2
2
|
import { tmpdir } from "node:os"
|
|
3
3
|
import { join } from "node:path"
|
|
4
4
|
import { fileURLToPath } from "node:url"
|
|
@@ -36,7 +36,7 @@ describe("install-peers helper", () => {
|
|
|
36
36
|
})
|
|
37
37
|
|
|
38
38
|
test("detectManager infers from lockfile", async () => {
|
|
39
|
-
const dir = await mkdtemp(join(tmpdir(), "
|
|
39
|
+
const dir = await mkdtemp(join(tmpdir(), "skyltmax-config-"))
|
|
40
40
|
await writeFile(join(dir, "bun.lockb"), "")
|
|
41
41
|
const manager = detectManager({ cwd: dir })
|
|
42
42
|
expect(manager).toBe("bun")
|
|
@@ -49,6 +49,19 @@ describe("install-peers helper", () => {
|
|
|
49
49
|
expect(formatCommand(result)).toBe("npm install --save-dev --save-exact eslint@9.39.1")
|
|
50
50
|
})
|
|
51
51
|
|
|
52
|
+
test("buildInstallCommand adds -w flag in pnpm workspaces", async () => {
|
|
53
|
+
const workspaceDir = await mkdtemp(join(tmpdir(), "skyltmax-config-workspace-"))
|
|
54
|
+
await writeFile(join(workspaceDir, "pnpm-workspace.yaml"), "packages:\n - packages/*\n")
|
|
55
|
+
const packageDir = join(workspaceDir, "packages", "app")
|
|
56
|
+
await mkdir(packageDir, { recursive: true })
|
|
57
|
+
|
|
58
|
+
const result = buildInstallCommand("pnpm", ["eslint@9.39.1"], { cwd: packageDir })
|
|
59
|
+
|
|
60
|
+
expect(result.command).toBe("pnpm")
|
|
61
|
+
expect(result.args).toEqual(["add", "-D", "-w", "--save-exact", "eslint@9.39.1"])
|
|
62
|
+
expect(result.cwd).toBe(workspaceDir)
|
|
63
|
+
})
|
|
64
|
+
|
|
52
65
|
test("buildInstallCommand throws on unsupported manager", () => {
|
|
53
66
|
expect(() => buildInstallCommand("yarn", ["eslint@9.39.1"])).toThrow(/Unsupported package manager/)
|
|
54
67
|
})
|
|
@@ -66,6 +79,29 @@ describe("install-peers helper", () => {
|
|
|
66
79
|
expect(result.printable).toBe("npm install --save-dev --save-exact eslint@9.39.1 prettier@3.6.2")
|
|
67
80
|
})
|
|
68
81
|
|
|
82
|
+
test("prepareInstall targets pnpm workspace root", async () => {
|
|
83
|
+
const workspaceDir = await mkdtemp(join(tmpdir(), "skyltmax-config-workspace-"))
|
|
84
|
+
await writeFile(join(workspaceDir, "pnpm-workspace.yaml"), "packages:\n - packages/*\n")
|
|
85
|
+
const manifestPath = join(workspaceDir, "package.json")
|
|
86
|
+
await writeFile(manifestPath, JSON.stringify({ peerDependencies: { eslint: "9.39.1" } }, null, 2))
|
|
87
|
+
|
|
88
|
+
const packageDir = join(workspaceDir, "packages", "app")
|
|
89
|
+
await mkdir(packageDir, { recursive: true })
|
|
90
|
+
|
|
91
|
+
const result = await prepareInstall({
|
|
92
|
+
managerArg: "pnpm",
|
|
93
|
+
env: {},
|
|
94
|
+
cwd: packageDir,
|
|
95
|
+
manifestPath,
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
expect(result.manager).toBe("pnpm")
|
|
99
|
+
expect(result.packages).toEqual(["eslint@9.39.1"])
|
|
100
|
+
expect(result.args).toEqual(["add", "-D", "-w", "--save-exact", "eslint@9.39.1"])
|
|
101
|
+
expect(result.cwd).toBe(workspaceDir)
|
|
102
|
+
expect(result.printable).toBe("pnpm add -D -w --save-exact eslint@9.39.1")
|
|
103
|
+
})
|
|
104
|
+
|
|
69
105
|
test("prepareInstall returns empty when no peers", async () => {
|
|
70
106
|
const result = await prepareInstall({
|
|
71
107
|
managerArg: "npm",
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: skyltmax_config
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.13.beta.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Signmax AB
|
|
@@ -136,7 +136,6 @@ metadata:
|
|
|
136
136
|
homepage_uri: https://github.com/skyltmax/config#readme
|
|
137
137
|
source_code_uri: https://github.com/skyltmax/config
|
|
138
138
|
bug_tracker_uri: https://github.com/skyltmax/config/issues
|
|
139
|
-
allowed_push_host: https://rubygems.org
|
|
140
139
|
rdoc_options: []
|
|
141
140
|
require_paths:
|
|
142
141
|
- lib
|
|
@@ -151,7 +150,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
151
150
|
- !ruby/object:Gem::Version
|
|
152
151
|
version: '3.2'
|
|
153
152
|
requirements: []
|
|
154
|
-
rubygems_version:
|
|
153
|
+
rubygems_version: 4.0.3
|
|
155
154
|
specification_version: 4
|
|
156
155
|
summary: Reasonable Rubocop configs.
|
|
157
156
|
test_files: []
|