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 ADDED
@@ -0,0 +1,366 @@
1
+ # dependency-grouper
2
+
3
+ > Group and reuse dependency sets across monorepo projects
4
+
5
+ [![npm version](https://img.shields.io/npm/v/dependency-grouper.svg)](https://www.npmjs.com/package/dependency-grouper)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -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"}
@@ -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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"}
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -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
+ }