dependency-grouper 0.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 +366 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +51 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +250 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +53 -0
package/README.md
ADDED
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
# dependency-grouper
|
|
2
|
+
|
|
3
|
+
> Group and reuse dependency sets across monorepo projects
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/dependency-grouper)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
|
|
8
|
+
**Works with:**
|
|
9
|
+
- ✅ pnpm workspaces
|
|
10
|
+
- ✅ npm workspaces
|
|
11
|
+
- ✅ yarn workspaces
|
|
12
|
+
|
|
13
|
+
## Problem
|
|
14
|
+
|
|
15
|
+
In a monorepo with multiple projects, you often have:
|
|
16
|
+
- Multiple React projects sharing the same React dependencies
|
|
17
|
+
- Multiple Vue projects sharing Vue dependencies
|
|
18
|
+
- Shared tooling dependencies (webpack, vite, eslint, etc.)
|
|
19
|
+
|
|
20
|
+
Currently, you have to:
|
|
21
|
+
1. Copy-paste dependencies across package.json files
|
|
22
|
+
2. Manually keep versions in sync
|
|
23
|
+
3. Update multiple places when upgrading
|
|
24
|
+
|
|
25
|
+
## Solution
|
|
26
|
+
|
|
27
|
+
Define dependency groups once, reference them anywhere:
|
|
28
|
+
|
|
29
|
+
```yaml
|
|
30
|
+
# .dep-groups.yaml
|
|
31
|
+
groups:
|
|
32
|
+
webpack:
|
|
33
|
+
dependencies:
|
|
34
|
+
webpack: ^5.95.0
|
|
35
|
+
webpack-cli: ^5.1.4
|
|
36
|
+
ts-loader: ^9.5.1
|
|
37
|
+
devDependencies:
|
|
38
|
+
'@types/webpack': ^5.28.0
|
|
39
|
+
|
|
40
|
+
vue:
|
|
41
|
+
dependencies:
|
|
42
|
+
vue: ^3.5.17
|
|
43
|
+
|
|
44
|
+
react:
|
|
45
|
+
dependencies:
|
|
46
|
+
react: ^18.2.0
|
|
47
|
+
react-dom: ^18.2.0
|
|
48
|
+
devDependencies:
|
|
49
|
+
'@types/react': ^18.2.0
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Then in your project's `package.json`:
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"name": "my-vue-app",
|
|
57
|
+
"depGroups": ["webpack", "vue"],
|
|
58
|
+
"dependencies": {
|
|
59
|
+
"axios": "^1.6.0"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Run `dependency-grouper generate` and it merges the groups with automatic sorting:
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"name": "my-vue-app",
|
|
69
|
+
"version": "1.0.0",
|
|
70
|
+
"dependencies": {
|
|
71
|
+
"axios": "^1.6.0",
|
|
72
|
+
"ts-loader": "^9.5.1",
|
|
73
|
+
"vue": "^3.5.17",
|
|
74
|
+
"webpack": "^5.95.0",
|
|
75
|
+
"webpack-cli": "^5.1.4"
|
|
76
|
+
},
|
|
77
|
+
"devDependencies": {
|
|
78
|
+
"@types/webpack": "^5.28.0"
|
|
79
|
+
},
|
|
80
|
+
"depGroups": [
|
|
81
|
+
"webpack",
|
|
82
|
+
"vue"
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Usage
|
|
88
|
+
|
|
89
|
+
### 1. Install
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
# pnpm
|
|
93
|
+
pnpm add -D dependency-grouper
|
|
94
|
+
|
|
95
|
+
# npm
|
|
96
|
+
npm install -D dependency-grouper
|
|
97
|
+
|
|
98
|
+
# yarn
|
|
99
|
+
yarn add -D dependency-grouper
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 2. Create `.dep-groups.yaml` at workspace root
|
|
103
|
+
|
|
104
|
+
```yaml
|
|
105
|
+
groups:
|
|
106
|
+
webpack:
|
|
107
|
+
dependencies:
|
|
108
|
+
webpack: ^5.95.0
|
|
109
|
+
webpack-cli: ^5.1.4
|
|
110
|
+
|
|
111
|
+
vue:
|
|
112
|
+
dependencies:
|
|
113
|
+
vue: ^3.5.17
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 3. Reference groups in package.json
|
|
117
|
+
|
|
118
|
+
```json
|
|
119
|
+
{
|
|
120
|
+
"name": "my-project",
|
|
121
|
+
"depGroups": ["webpack", "vue"],
|
|
122
|
+
"dependencies": {
|
|
123
|
+
"my-custom-dep": "^1.0.0"
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### 4. Generate dependencies
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
dependency-grouper generate
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### 5. Install dependencies
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
# pnpm
|
|
138
|
+
pnpm install
|
|
139
|
+
|
|
140
|
+
# npm
|
|
141
|
+
npm install
|
|
142
|
+
|
|
143
|
+
# yarn
|
|
144
|
+
yarn install
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Automatic Generation (Optional)
|
|
148
|
+
|
|
149
|
+
### Option 1: Preinstall Hook (Full Generation)
|
|
150
|
+
|
|
151
|
+
To automatically generate dependencies before every install, add to your **workspace root** `package.json`:
|
|
152
|
+
|
|
153
|
+
```json
|
|
154
|
+
{
|
|
155
|
+
"name": "my-monorepo",
|
|
156
|
+
"private": true,
|
|
157
|
+
"scripts": {
|
|
158
|
+
"preinstall": "dependency-grouper generate"
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Option 2: Postinstall Hook (Sync Only) - Recommended for Development
|
|
164
|
+
|
|
165
|
+
To automatically sync new dependencies after install without regenerating all files:
|
|
166
|
+
|
|
167
|
+
```json
|
|
168
|
+
{
|
|
169
|
+
"name": "my-monorepo",
|
|
170
|
+
"private": true,
|
|
171
|
+
"scripts": {
|
|
172
|
+
"postinstall": "dependency-grouper sync"
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**How it works:**
|
|
178
|
+
1. You run `pnpm add axios` in any package
|
|
179
|
+
2. pnpm installs axios
|
|
180
|
+
3. postinstall hook automatically runs `dependency-grouper sync`
|
|
181
|
+
4. axios is captured in .dep-groups.yaml
|
|
182
|
+
5. Next time you/anyone runs `generate`, all packages in that group get axios
|
|
183
|
+
|
|
184
|
+
**Perfect for development** - captures new dependencies automatically without slowing down every install.
|
|
185
|
+
|
|
186
|
+
### Comparison
|
|
187
|
+
|
|
188
|
+
| Hook | Command | When | Updates .dep-groups.yaml | Updates package.json |
|
|
189
|
+
|------|---------|------|--------------------------|---------------------|
|
|
190
|
+
| preinstall | `generate` | Before install | ✅ | ✅ |
|
|
191
|
+
| postinstall | `sync` | After install | ✅ | ❌ |
|
|
192
|
+
|
|
193
|
+
**Benefits:**
|
|
194
|
+
- ✅ No manual `generate` command needed
|
|
195
|
+
- ✅ Dependencies always up-to-date before install
|
|
196
|
+
- ✅ Team members don't need to remember to run generate
|
|
197
|
+
|
|
198
|
+
**When to use:**
|
|
199
|
+
- ✓ Production/CI workflows - ensures consistency
|
|
200
|
+
- ✓ Team environments - automatic for everyone
|
|
201
|
+
- ✗ Active development - can be slower if you install frequently
|
|
202
|
+
|
|
203
|
+
**Note:** Make sure `dependency-grouper` is installed before the preinstall hook runs. Add it as a devDependency at the workspace root.
|
|
204
|
+
|
|
205
|
+
## Features
|
|
206
|
+
|
|
207
|
+
- ✅ **Multi-package manager** - Works with pnpm, npm, and yarn workspaces
|
|
208
|
+
- ✅ **Define once, use everywhere** - Create dependency groups in one place
|
|
209
|
+
- ✅ **Bidirectional sync** - Updates flow both ways automatically
|
|
210
|
+
- ✅ **Automatic sorting** - package.json keys and dependencies alphabetically sorted
|
|
211
|
+
- ✅ **Type-safe** - Full TypeScript support with type definitions
|
|
212
|
+
- ✅ **Smart merging** - Preserves project-specific dependencies
|
|
213
|
+
- ✅ **Version control** - Update versions in one place
|
|
214
|
+
- ✅ **CI/CD ready** - Optional preinstall hook for automation
|
|
215
|
+
|
|
216
|
+
## Configuration
|
|
217
|
+
|
|
218
|
+
### .dep-groups.yaml
|
|
219
|
+
|
|
220
|
+
```yaml
|
|
221
|
+
groups:
|
|
222
|
+
groupName:
|
|
223
|
+
dependencies:
|
|
224
|
+
package-name: version
|
|
225
|
+
devDependencies:
|
|
226
|
+
dev-package: version
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### package.json
|
|
230
|
+
|
|
231
|
+
```json
|
|
232
|
+
{
|
|
233
|
+
"depGroups": ["groupName1", "groupName2"]
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
## How It Works
|
|
238
|
+
|
|
239
|
+
1. Detects workspace root (pnpm-workspace.yaml, npm/yarn workspaces, or .dep-groups.yaml)
|
|
240
|
+
2. Syncs new dependencies from package.json files to .dep-groups.yaml (bidirectional)
|
|
241
|
+
3. Finds all package.json files with `depGroups` field
|
|
242
|
+
4. Merges specified groups with existing dependencies
|
|
243
|
+
5. Sorts dependencies alphabetically within each section
|
|
244
|
+
6. Formats entire package.json with proper key ordering
|
|
245
|
+
7. Writes updated package.json files
|
|
246
|
+
8. Preserves project-specific dependencies
|
|
247
|
+
|
|
248
|
+
## Development
|
|
249
|
+
|
|
250
|
+
### Running Tests
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
npm test
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### Testing in Example Monorepo
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
cd example
|
|
260
|
+
node ../dist/cli.js generate
|
|
261
|
+
pnpm install
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
The `example/` directory contains a working pnpm monorepo with:
|
|
265
|
+
- `react-app` - Uses react and webpack groups
|
|
266
|
+
- `vue-app` - Uses vue, vite, and testing groups
|
|
267
|
+
|
|
268
|
+
## CLI Commands
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
# Show help
|
|
272
|
+
dependency-grouper
|
|
273
|
+
|
|
274
|
+
# Generate dependencies from groups (sync + merge)
|
|
275
|
+
dependency-grouper generate
|
|
276
|
+
|
|
277
|
+
# Only sync package.json → .dep-groups.yaml (no merge back)
|
|
278
|
+
dependency-grouper sync
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### When to Use Each Command
|
|
282
|
+
|
|
283
|
+
**`generate`** (Recommended for most cases)
|
|
284
|
+
- Full bidirectional sync
|
|
285
|
+
- Updates .dep-groups.yaml from package.json files
|
|
286
|
+
- Then updates all package.json files from .dep-groups.yaml
|
|
287
|
+
- Use in preinstall hooks or manually
|
|
288
|
+
|
|
289
|
+
**`sync`** (Lightweight)
|
|
290
|
+
- Only updates .dep-groups.yaml from package.json files
|
|
291
|
+
- Doesn't modify any package.json files
|
|
292
|
+
- Faster, useful for postinstall hooks to capture new dependencies
|
|
293
|
+
- Good for CI/CD to keep .dep-groups.yaml in sync
|
|
294
|
+
|
|
295
|
+
## Example Workflow
|
|
296
|
+
|
|
297
|
+
### Initial Setup
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
# 1. Install at workspace root
|
|
301
|
+
pnpm add -D dependency-grouper
|
|
302
|
+
|
|
303
|
+
# 2. Create .dep-groups.yaml
|
|
304
|
+
cat > .dep-groups.yaml << EOF
|
|
305
|
+
groups:
|
|
306
|
+
react:
|
|
307
|
+
dependencies:
|
|
308
|
+
react: "^18.2.0"
|
|
309
|
+
react-dom: "^18.2.0"
|
|
310
|
+
EOF
|
|
311
|
+
|
|
312
|
+
# 3. Add depGroups to a package
|
|
313
|
+
cat > packages/my-app/package.json << EOF
|
|
314
|
+
{
|
|
315
|
+
"name": "my-app",
|
|
316
|
+
"version": "1.0.0",
|
|
317
|
+
"depGroups": ["react"]
|
|
318
|
+
}
|
|
319
|
+
EOF
|
|
320
|
+
|
|
321
|
+
# 4. Generate
|
|
322
|
+
dependency-grouper generate
|
|
323
|
+
|
|
324
|
+
# 5. Install
|
|
325
|
+
pnpm install
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### Daily Development
|
|
329
|
+
|
|
330
|
+
```bash
|
|
331
|
+
# You manually add a package
|
|
332
|
+
cd packages/my-app
|
|
333
|
+
pnpm add axios
|
|
334
|
+
# ↑ postinstall hook runs automatically!
|
|
335
|
+
# → dependency-grouper sync
|
|
336
|
+
# → axios is now in .dep-groups.yaml
|
|
337
|
+
|
|
338
|
+
# Later, share it with other packages
|
|
339
|
+
dependency-grouper generate
|
|
340
|
+
# → All packages with same depGroups get axios
|
|
341
|
+
|
|
342
|
+
# Or if you have preinstall hook, just:
|
|
343
|
+
pnpm install
|
|
344
|
+
# → generate runs automatically before install
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
**With postinstall hook configured:**
|
|
348
|
+
```bash
|
|
349
|
+
pnpm add lodash
|
|
350
|
+
# 1. lodash added to current package.json
|
|
351
|
+
# 2. pnpm installs lodash
|
|
352
|
+
# 3. postinstall runs: dependency-grouper sync
|
|
353
|
+
# 4. lodash automatically added to .dep-groups.yaml
|
|
354
|
+
# 5. Next time anyone runs generate, they get lodash too
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### Adding to Existing Groups
|
|
358
|
+
|
|
359
|
+
When you `pnpm add` a package to a project that has `depGroups`, the next time you run `generate`, it will:
|
|
360
|
+
1. Detect the new package in your package.json
|
|
361
|
+
2. Automatically add it to all groups listed in `depGroups`
|
|
362
|
+
3. Sync it across all packages using those groups
|
|
363
|
+
|
|
364
|
+
## License
|
|
365
|
+
|
|
366
|
+
MIT
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const index_1 = require("./index");
|
|
8
|
+
const process_1 = __importDefault(require("process"));
|
|
9
|
+
const command = process_1.default.argv[2];
|
|
10
|
+
if (command === 'generate') {
|
|
11
|
+
try {
|
|
12
|
+
(0, index_1.generateDependencies)();
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
16
|
+
process_1.default.exit(1);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
else if (command === 'sync') {
|
|
20
|
+
try {
|
|
21
|
+
const workspaceRoot = require('./index').findWorkspaceRoot();
|
|
22
|
+
if (!workspaceRoot) {
|
|
23
|
+
console.error('Could not find workspace root');
|
|
24
|
+
process_1.default.exit(1);
|
|
25
|
+
}
|
|
26
|
+
console.log(`Found workspace root: ${workspaceRoot}\n`);
|
|
27
|
+
require('./index').syncFromPackages(workspaceRoot);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
console.error('Error:', error instanceof Error ? error.message : error);
|
|
31
|
+
process_1.default.exit(1);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.log(`
|
|
36
|
+
dependency-grouper - Group and reuse dependency sets
|
|
37
|
+
|
|
38
|
+
Usage:
|
|
39
|
+
dependency-grouper generate Generate dependencies from groups
|
|
40
|
+
dependency-grouper sync Sync package.json dependencies to .dep-groups.yaml
|
|
41
|
+
|
|
42
|
+
Example:
|
|
43
|
+
1. Create .dep-groups.yaml at workspace root
|
|
44
|
+
2. Add "depGroups": ["groupName"] to package.json
|
|
45
|
+
3. Run: dependency-grouper generate
|
|
46
|
+
|
|
47
|
+
Supports: pnpm, npm, and yarn workspaces
|
|
48
|
+
`);
|
|
49
|
+
process_1.default.exit(command ? 1 : 0);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;AAEA,mCAA+C;AAC/C,sDAA8B;AAE9B,MAAM,OAAO,GAAG,iBAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEhC,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,IAAA,4BAAoB,GAAE,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,iBAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;KAAM,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,iBAAiB,EAAE,CAAC;QAC7D,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC/C,iBAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,yBAAyB,aAAa,IAAI,CAAC,CAAC;QACxD,OAAO,CAAC,SAAS,CAAC,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxE,iBAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;GAaX,CAAC,CAAC;IACH,iBAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DepGroups, PackageJson } from './types';
|
|
2
|
+
export declare function findWorkspaceRoot(startDir?: string): string | null;
|
|
3
|
+
export declare function loadDepGroups(rootDir: string): DepGroups;
|
|
4
|
+
export declare function findPackageJsonFiles(rootDir: string): string[];
|
|
5
|
+
export declare function syncFromPackages(rootDir: string): void;
|
|
6
|
+
export declare function mergeDepGroups(packageJson: PackageJson, depGroups: DepGroups): PackageJson;
|
|
7
|
+
export declare function generateDependencies(rootDir?: string): void;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAiB,MAAM,SAAS,CAAC;AAEhE,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAkCjF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CASxD;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAwB9D;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAsEtD;AAED,wBAAgB,cAAc,CAC5B,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,GACnB,WAAW,CAoDb;AAED,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAkD3D"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.findWorkspaceRoot = findWorkspaceRoot;
|
|
40
|
+
exports.loadDepGroups = loadDepGroups;
|
|
41
|
+
exports.findPackageJsonFiles = findPackageJsonFiles;
|
|
42
|
+
exports.syncFromPackages = syncFromPackages;
|
|
43
|
+
exports.mergeDepGroups = mergeDepGroups;
|
|
44
|
+
exports.generateDependencies = generateDependencies;
|
|
45
|
+
const fs = __importStar(require("fs"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const yaml = __importStar(require("yaml"));
|
|
48
|
+
const sort_package_json_1 = __importDefault(require("sort-package-json"));
|
|
49
|
+
function findWorkspaceRoot(startDir = process.cwd()) {
|
|
50
|
+
let currentDir = startDir;
|
|
51
|
+
while (currentDir !== path.parse(currentDir).root) {
|
|
52
|
+
const pnpmWorkspace = path.join(currentDir, 'pnpm-workspace.yaml');
|
|
53
|
+
const configPath = path.join(currentDir, '.dep-groups.yaml');
|
|
54
|
+
const packageJsonPath = path.join(currentDir, 'package.json');
|
|
55
|
+
// Check for .dep-groups.yaml first
|
|
56
|
+
if (fs.existsSync(configPath)) {
|
|
57
|
+
return currentDir;
|
|
58
|
+
}
|
|
59
|
+
// Check for pnpm workspace
|
|
60
|
+
if (fs.existsSync(pnpmWorkspace)) {
|
|
61
|
+
return currentDir;
|
|
62
|
+
}
|
|
63
|
+
// Check for npm/yarn workspaces in package.json
|
|
64
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
65
|
+
try {
|
|
66
|
+
const pkgContent = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
67
|
+
if (pkgContent.workspaces) {
|
|
68
|
+
return currentDir;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
// Invalid package.json, continue searching
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
currentDir = path.dirname(currentDir);
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
function loadDepGroups(rootDir) {
|
|
80
|
+
const configPath = path.join(rootDir, '.dep-groups.yaml');
|
|
81
|
+
if (!fs.existsSync(configPath)) {
|
|
82
|
+
throw new Error(`.dep-groups.yaml not found at ${configPath}`);
|
|
83
|
+
}
|
|
84
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
85
|
+
return yaml.parse(content);
|
|
86
|
+
}
|
|
87
|
+
function findPackageJsonFiles(rootDir) {
|
|
88
|
+
const packages = [];
|
|
89
|
+
function walk(dir) {
|
|
90
|
+
if (dir.includes('node_modules') || dir.includes('.git')) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const files = fs.readdirSync(dir);
|
|
94
|
+
for (const file of files) {
|
|
95
|
+
const fullPath = path.join(dir, file);
|
|
96
|
+
const stat = fs.statSync(fullPath);
|
|
97
|
+
if (stat.isDirectory()) {
|
|
98
|
+
walk(fullPath);
|
|
99
|
+
}
|
|
100
|
+
else if (file === 'package.json') {
|
|
101
|
+
packages.push(fullPath);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
walk(rootDir);
|
|
106
|
+
return packages;
|
|
107
|
+
}
|
|
108
|
+
function syncFromPackages(rootDir) {
|
|
109
|
+
const configPath = path.join(rootDir, '.dep-groups.yaml');
|
|
110
|
+
// Load existing groups or create empty structure
|
|
111
|
+
let depGroups;
|
|
112
|
+
if (fs.existsSync(configPath)) {
|
|
113
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
114
|
+
depGroups = yaml.parse(content);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
depGroups = { groups: {} };
|
|
118
|
+
}
|
|
119
|
+
const packageFiles = findPackageJsonFiles(rootDir);
|
|
120
|
+
let updated = false;
|
|
121
|
+
for (const pkgPath of packageFiles) {
|
|
122
|
+
const content = fs.readFileSync(pkgPath, 'utf-8');
|
|
123
|
+
const packageJson = JSON.parse(content);
|
|
124
|
+
if (!packageJson.depGroups || packageJson.depGroups.length === 0) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
// For each group referenced, ensure it exists and has all dependencies from package.json
|
|
128
|
+
for (const groupName of packageJson.depGroups) {
|
|
129
|
+
if (!depGroups.groups[groupName]) {
|
|
130
|
+
depGroups.groups[groupName] = {};
|
|
131
|
+
}
|
|
132
|
+
const group = depGroups.groups[groupName];
|
|
133
|
+
// Sync dependencies
|
|
134
|
+
if (packageJson.dependencies) {
|
|
135
|
+
if (!group.dependencies) {
|
|
136
|
+
group.dependencies = {};
|
|
137
|
+
}
|
|
138
|
+
for (const [dep, version] of Object.entries(packageJson.dependencies)) {
|
|
139
|
+
// Only add if not already in group
|
|
140
|
+
if (!group.dependencies[dep]) {
|
|
141
|
+
group.dependencies[dep] = version;
|
|
142
|
+
updated = true;
|
|
143
|
+
console.log(` + Added ${dep}@${version} to group "${groupName}"`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Sync devDependencies
|
|
148
|
+
if (packageJson.devDependencies) {
|
|
149
|
+
if (!group.devDependencies) {
|
|
150
|
+
group.devDependencies = {};
|
|
151
|
+
}
|
|
152
|
+
for (const [dep, version] of Object.entries(packageJson.devDependencies)) {
|
|
153
|
+
// Only add if not already in group
|
|
154
|
+
if (!group.devDependencies[dep]) {
|
|
155
|
+
group.devDependencies[dep] = version;
|
|
156
|
+
updated = true;
|
|
157
|
+
console.log(` + Added ${dep}@${version} (dev) to group "${groupName}"`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (updated) {
|
|
164
|
+
// Write back to .dep-groups.yaml
|
|
165
|
+
fs.writeFileSync(configPath, yaml.stringify(depGroups), 'utf-8');
|
|
166
|
+
console.log(`\n✓ Updated .dep-groups.yaml\n`);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
console.log('✓ .dep-groups.yaml is up to date\n');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function mergeDepGroups(packageJson, depGroups) {
|
|
173
|
+
if (!packageJson.depGroups || packageJson.depGroups.length === 0) {
|
|
174
|
+
return packageJson;
|
|
175
|
+
}
|
|
176
|
+
const merged = { ...packageJson };
|
|
177
|
+
merged.dependencies = { ...packageJson.dependencies };
|
|
178
|
+
merged.devDependencies = { ...packageJson.devDependencies };
|
|
179
|
+
for (const groupName of packageJson.depGroups) {
|
|
180
|
+
const group = depGroups.groups[groupName];
|
|
181
|
+
if (!group) {
|
|
182
|
+
console.warn(`Warning: Group "${groupName}" not found in .dep-groups.yaml`);
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
if (group.dependencies) {
|
|
186
|
+
merged.dependencies = {
|
|
187
|
+
...merged.dependencies,
|
|
188
|
+
...group.dependencies,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
if (group.devDependencies) {
|
|
192
|
+
merged.devDependencies = {
|
|
193
|
+
...merged.devDependencies,
|
|
194
|
+
...group.devDependencies,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Sort dependencies alphabetically
|
|
199
|
+
if (merged.dependencies) {
|
|
200
|
+
merged.dependencies = Object.keys(merged.dependencies)
|
|
201
|
+
.sort()
|
|
202
|
+
.reduce((acc, key) => {
|
|
203
|
+
acc[key] = merged.dependencies[key];
|
|
204
|
+
return acc;
|
|
205
|
+
}, {});
|
|
206
|
+
}
|
|
207
|
+
if (merged.devDependencies) {
|
|
208
|
+
merged.devDependencies = Object.keys(merged.devDependencies)
|
|
209
|
+
.sort()
|
|
210
|
+
.reduce((acc, key) => {
|
|
211
|
+
acc[key] = merged.devDependencies[key];
|
|
212
|
+
return acc;
|
|
213
|
+
}, {});
|
|
214
|
+
}
|
|
215
|
+
return merged;
|
|
216
|
+
}
|
|
217
|
+
function generateDependencies(rootDir) {
|
|
218
|
+
const workspaceRoot = rootDir || findWorkspaceRoot();
|
|
219
|
+
if (!workspaceRoot) {
|
|
220
|
+
console.error('Could not find workspace root (looking for pnpm-workspace.yaml, npm/yarn workspaces, or .dep-groups.yaml)');
|
|
221
|
+
process.exit(1);
|
|
222
|
+
}
|
|
223
|
+
console.log(`Found workspace root: ${workspaceRoot}\n`);
|
|
224
|
+
// Step 1: Sync from package.json to .dep-groups.yaml
|
|
225
|
+
console.log('Step 1: Syncing from package.json to .dep-groups.yaml...');
|
|
226
|
+
syncFromPackages(workspaceRoot);
|
|
227
|
+
// Step 2: Load updated groups
|
|
228
|
+
console.log('Step 2: Merging from .dep-groups.yaml to package.json...');
|
|
229
|
+
const depGroups = loadDepGroups(workspaceRoot);
|
|
230
|
+
const packageFiles = findPackageJsonFiles(workspaceRoot);
|
|
231
|
+
console.log(`Found ${packageFiles.length} package.json files`);
|
|
232
|
+
let processed = 0;
|
|
233
|
+
for (const pkgPath of packageFiles) {
|
|
234
|
+
const content = fs.readFileSync(pkgPath, 'utf-8');
|
|
235
|
+
const packageJson = JSON.parse(content);
|
|
236
|
+
if (!packageJson.depGroups || packageJson.depGroups.length === 0) {
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
console.log(`Processing ${packageJson.name}...`);
|
|
240
|
+
const merged = mergeDepGroups(packageJson, depGroups);
|
|
241
|
+
// Sort package.json keys using sort-package-json
|
|
242
|
+
const sorted = (0, sort_package_json_1.default)(merged);
|
|
243
|
+
// Write back to file
|
|
244
|
+
fs.writeFileSync(pkgPath, JSON.stringify(sorted, null, 2) + '\n', 'utf-8');
|
|
245
|
+
processed++;
|
|
246
|
+
console.log(` ✓ Updated with groups: ${packageJson.depGroups.join(', ')}`);
|
|
247
|
+
}
|
|
248
|
+
console.log(`\nSuccessfully processed ${processed} package(s)`);
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface DependencySet {
|
|
2
|
+
dependencies?: Record<string, string>;
|
|
3
|
+
devDependencies?: Record<string, string>;
|
|
4
|
+
}
|
|
5
|
+
export interface DepGroups {
|
|
6
|
+
groups: Record<string, DependencySet>;
|
|
7
|
+
}
|
|
8
|
+
export interface PackageJson {
|
|
9
|
+
name: string;
|
|
10
|
+
depGroups?: string[];
|
|
11
|
+
dependencies?: Record<string, string>;
|
|
12
|
+
devDependencies?: Record<string, string>;
|
|
13
|
+
[key: string]: any;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dependency-grouper",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Group and reuse dependency sets across monorepo projects (pnpm, npm, yarn)",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"dependency-grouper": "dist/cli.js",
|
|
9
|
+
"dep-grouper": "dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"dev": "tsc --watch",
|
|
18
|
+
"test": "npm run build && node test/test.js",
|
|
19
|
+
"prepublishOnly": "npm run build"
|
|
20
|
+
},
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+https://github.com/ozgurseyidoglu/dependency-grouper.git"
|
|
24
|
+
},
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/ozgurseyidoglu/dependency-grouper/issues"
|
|
27
|
+
},
|
|
28
|
+
"homepage": "https://github.com/ozgurseyidoglu/dependency-grouper#readme",
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=16.0.0"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"pnpm",
|
|
34
|
+
"npm",
|
|
35
|
+
"yarn",
|
|
36
|
+
"dependencies",
|
|
37
|
+
"workspace",
|
|
38
|
+
"workspaces",
|
|
39
|
+
"monorepo",
|
|
40
|
+
"package-manager",
|
|
41
|
+
"dependency-management"
|
|
42
|
+
],
|
|
43
|
+
"author": "ozjsey",
|
|
44
|
+
"license": "MIT",
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@types/node": "^20.11.0",
|
|
47
|
+
"typescript": "^5.3.3"
|
|
48
|
+
},
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"sort-package-json": "^2.10.0",
|
|
51
|
+
"yaml": "^2.3.4"
|
|
52
|
+
}
|
|
53
|
+
}
|