@sandboxpm/linker 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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 sandboxpm contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @sandboxpm/linker
3
+ *
4
+ * Builds pnpm-style non-flat node_modules using hard links from the CAS store.
5
+ */
6
+ import type { CASStore } from '@sandboxpm/store';
7
+ import type { ResolvedTree } from '@sandboxpm/resolver';
8
+ import type { FetchResult } from '@sandboxpm/fetcher';
9
+ export interface LinkOptions {
10
+ projectDir: string;
11
+ includeDevDependencies: boolean;
12
+ }
13
+ export interface LinkResult {
14
+ linkedPackages: number;
15
+ hardLinksCreated: number;
16
+ symlinksCreated: number;
17
+ bytesFromStore: number;
18
+ }
19
+ export declare class Linker {
20
+ private readonly store;
21
+ constructor(store: CASStore);
22
+ link(tree: ResolvedTree, fetchResults: Map<string, FetchResult>, opts: LinkOptions): Promise<LinkResult>;
23
+ unlink(projectDir: string): Promise<void>;
24
+ private _findVersion;
25
+ private _ensureSymlink;
26
+ private _linkBins;
27
+ private _readPackageJson;
28
+ }
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,qBAAqB,CAAA;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,sBAAsB,EAAE,OAAO,CAAA;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;gBAEpB,KAAK,EAAE,QAAQ;IAIrB,IAAI,CACR,IAAI,EAAE,YAAY,EAClB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EACtC,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,UAAU,CAAC;IA2HhB,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B/C,OAAO,CAAC,YAAY;YAQN,cAAc;YAkBd,SAAS;YA8CT,gBAAgB;CAQ/B"}
package/dist/index.js ADDED
@@ -0,0 +1,231 @@
1
+ /**
2
+ * @sandboxpm/linker
3
+ *
4
+ * Builds pnpm-style non-flat node_modules using hard links from the CAS store.
5
+ */
6
+ import * as fs from 'fs/promises';
7
+ import * as path from 'path';
8
+ export class Linker {
9
+ store;
10
+ constructor(store) {
11
+ this.store = store;
12
+ }
13
+ async link(tree, fetchResults, opts) {
14
+ const { projectDir } = opts;
15
+ const nodeModules = path.join(projectDir, 'node_modules');
16
+ const sandboxpmDir = path.join(nodeModules, '.sandboxpm');
17
+ // Clean .sandboxpm directory if it exists
18
+ await fs.rm(sandboxpmDir, { recursive: true, force: true });
19
+ await fs.mkdir(sandboxpmDir, { recursive: true });
20
+ await fs.mkdir(path.join(nodeModules, '.bin'), { recursive: true });
21
+ const result = {
22
+ linkedPackages: 0,
23
+ hardLinksCreated: 0,
24
+ symlinksCreated: 0,
25
+ bytesFromStore: 0,
26
+ };
27
+ const directDepNames = new Set(tree.directDeps.map(d => d.name));
28
+ // Step 1: For each resolved package, create its directory and hard-link files
29
+ for (const [key, pkg] of tree.packages) {
30
+ const fetchResult = fetchResults.get(key);
31
+ if (!fetchResult)
32
+ continue;
33
+ const pkgDir = path.join(sandboxpmDir, key, 'node_modules', pkg.name);
34
+ await fs.mkdir(pkgDir, { recursive: true });
35
+ // Hard-link each file from the CAS store
36
+ for (const fileMapping of fetchResult.files) {
37
+ const destPath = path.join(pkgDir, fileMapping.relativePath);
38
+ await this.store.link(fileMapping.hash, destPath);
39
+ // Restore file mode bits
40
+ try {
41
+ await fs.chmod(destPath, fileMapping.mode);
42
+ }
43
+ catch {
44
+ // chmod may fail on some systems; non-fatal
45
+ }
46
+ result.hardLinksCreated++;
47
+ result.bytesFromStore += fileMapping.size;
48
+ }
49
+ result.linkedPackages++;
50
+ }
51
+ // Step 2: Symlink direct deps into root node_modules/
52
+ for (const dep of tree.directDeps) {
53
+ if (dep.type === 'dev' && !opts.includeDevDependencies)
54
+ continue;
55
+ const resolvedVersion = this._findVersion(tree, dep.name);
56
+ if (!resolvedVersion)
57
+ continue;
58
+ const key = `${dep.name}@${resolvedVersion}`;
59
+ // A direct dep resolved into the tree but never fetched (e.g. an optional
60
+ // platform package that doesn't match this host — see resolver/fetcher) has
61
+ // nothing under sandboxpmDir to point at; skip it rather than create a symlink
62
+ // dangling at a target that was never created.
63
+ if (!fetchResults.has(key))
64
+ continue;
65
+ const targetDir = path.join(sandboxpmDir, key, 'node_modules', dep.name);
66
+ const symlinkPath = path.join(nodeModules, dep.name);
67
+ await this._ensureSymlink(targetDir, symlinkPath);
68
+ result.symlinksCreated++;
69
+ }
70
+ // Step 3: Symlink transitive deps (including optionalDependencies — e.g. a
71
+ // platform binary package like @swc/core-win32-x64-msvc — inside each package's
72
+ // own node_modules/
73
+ for (const [key, pkg] of tree.packages) {
74
+ const pkgNodeModules = path.join(sandboxpmDir, key, 'node_modules');
75
+ const allDeps = { ...pkg.dependencies, ...pkg.optionalDependencies };
76
+ for (const [depName, depVersion] of Object.entries(allDeps)) {
77
+ const depKey = `${depName}@${depVersion}`;
78
+ if (!tree.packages.has(depKey))
79
+ continue;
80
+ // Same "was it actually fetched" guard as Step 2 — an unfetched platform
81
+ // sibling must not get a dangling symlink.
82
+ if (!fetchResults.has(depKey))
83
+ continue;
84
+ const targetDir = path.join(sandboxpmDir, depKey, 'node_modules', depName);
85
+ const symlinkPath = path.join(pkgNodeModules, depName);
86
+ // Don't create if it's the package itself (can happen with peer deps)
87
+ if (symlinkPath === path.join(pkgNodeModules, pkg.name))
88
+ continue;
89
+ await this._ensureSymlink(targetDir, symlinkPath);
90
+ result.symlinksCreated++;
91
+ }
92
+ }
93
+ // Step 4: Bin links for direct project deps into the root node_modules/.bin
94
+ for (const [key, pkg] of tree.packages) {
95
+ if (!directDepNames.has(pkg.name))
96
+ continue;
97
+ const fetchResult = fetchResults.get(key);
98
+ if (!fetchResult)
99
+ continue;
100
+ const pkgDir = path.join(sandboxpmDir, key, 'node_modules', pkg.name);
101
+ await this._linkBins(pkgDir, pkg, nodeModules, result);
102
+ }
103
+ // Step 4b: Per-package bin links — populate each package's sibling
104
+ // node_modules/.bin with its direct deps' executables.
105
+ // Required so lifecycle scripts (node-pre-gyp, prebuild-install, node-gyp)
106
+ // are found when running install scripts inside the package directory.
107
+ for (const [key, pkg] of tree.packages) {
108
+ const pkgNodeModules = path.join(sandboxpmDir, key, 'node_modules');
109
+ const allDeps = { ...pkg.dependencies, ...pkg.optionalDependencies };
110
+ for (const [depName, depVersion] of Object.entries(allDeps)) {
111
+ const depKey = `${depName}@${depVersion}`;
112
+ if (!fetchResults.has(depKey))
113
+ continue;
114
+ const depPkg = tree.packages.get(depKey);
115
+ if (!depPkg)
116
+ continue;
117
+ const depPkgDir = path.join(sandboxpmDir, depKey, 'node_modules', depPkg.name);
118
+ await this._linkBins(depPkgDir, depPkg, pkgNodeModules, result);
119
+ }
120
+ }
121
+ return result;
122
+ }
123
+ async unlink(projectDir) {
124
+ const nodeModules = path.join(projectDir, 'node_modules');
125
+ // Remove .sandboxpm/ dir
126
+ await fs.rm(path.join(nodeModules, '.sandboxpm'), { recursive: true, force: true });
127
+ // Remove root-level symlinks that point into .sandboxpm
128
+ let entries;
129
+ try {
130
+ entries = await fs.readdir(nodeModules, { withFileTypes: true });
131
+ }
132
+ catch {
133
+ return;
134
+ }
135
+ for (const entry of entries) {
136
+ if (entry.name.startsWith('.'))
137
+ continue;
138
+ if (!entry.isSymbolicLink())
139
+ continue;
140
+ const symlinkPath = path.join(nodeModules, entry.name);
141
+ try {
142
+ const target = await fs.readlink(symlinkPath);
143
+ if (target.includes('.sandboxpm')) {
144
+ await fs.rm(symlinkPath, { force: true });
145
+ }
146
+ }
147
+ catch {
148
+ // ignore
149
+ }
150
+ }
151
+ }
152
+ _findVersion(tree, name) {
153
+ for (const key of tree.packages.keys()) {
154
+ const pkg = tree.packages.get(key);
155
+ if (pkg?.name === name)
156
+ return pkg.version;
157
+ }
158
+ return undefined;
159
+ }
160
+ async _ensureSymlink(target, symlinkPath) {
161
+ await fs.mkdir(path.dirname(symlinkPath), { recursive: true });
162
+ try {
163
+ if (process.platform === 'win32') {
164
+ // Junctions don't require elevated privileges on Windows (unlike symlinks).
165
+ // Use junction for directories; file type for everything else.
166
+ let isDir = false;
167
+ try {
168
+ isDir = (await fs.stat(target)).isDirectory();
169
+ }
170
+ catch { /* target may not exist yet */ }
171
+ await fs.symlink(target, symlinkPath, isDir ? 'junction' : 'file');
172
+ }
173
+ else {
174
+ await fs.symlink(target, symlinkPath);
175
+ }
176
+ }
177
+ catch (err) {
178
+ if (err.code === 'EEXIST')
179
+ return;
180
+ throw err;
181
+ }
182
+ }
183
+ async _linkBins(pkgDir, pkg, nodeModules, result) {
184
+ const pkgJson = await this._readPackageJson(pkgDir);
185
+ if (!pkgJson)
186
+ return;
187
+ const bin = pkgJson.bin;
188
+ if (!bin)
189
+ return;
190
+ const binDir = path.join(nodeModules, '.bin');
191
+ const binEntries = typeof bin === 'string'
192
+ ? { [pkg.name]: bin }
193
+ : bin;
194
+ for (const [binName, binFile] of Object.entries(binEntries)) {
195
+ const target = path.resolve(pkgDir, binFile);
196
+ const symlinkPath = path.join(binDir, binName);
197
+ try {
198
+ await this._ensureSymlink(target, symlinkPath);
199
+ }
200
+ catch (err) {
201
+ if (process.platform === 'win32' && err.code === 'EPERM') {
202
+ // File symlinks require Developer Mode or admin on Windows; create a .cmd shim instead.
203
+ try {
204
+ await fs.writeFile(`${symlinkPath}.cmd`, `@node "${target.replace(/\//g, '\\')}" %*\r\n`, 'utf8');
205
+ }
206
+ catch { /* non-fatal */ }
207
+ }
208
+ else {
209
+ throw err;
210
+ }
211
+ }
212
+ try {
213
+ await fs.chmod(target, 0o755);
214
+ }
215
+ catch {
216
+ // chmod may fail on some systems; non-fatal
217
+ }
218
+ result.symlinksCreated++;
219
+ }
220
+ }
221
+ async _readPackageJson(pkgDir) {
222
+ try {
223
+ const content = await fs.readFile(path.join(pkgDir, 'package.json'), 'utf8');
224
+ return JSON.parse(content);
225
+ }
226
+ catch {
227
+ return null;
228
+ }
229
+ }
230
+ }
231
+ //# 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/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@sandboxpm/linker",
3
+ "version": "0.1.0",
4
+ "description": "Builds non-flat node_modules from the sandboxpm content-addressable store",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/daviddaco1/sandboxpm.git",
9
+ "directory": "packages/linker"
10
+ },
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "type": "module",
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "files": [
18
+ "dist",
19
+ "!dist/**/*.tsbuildinfo"
20
+ ],
21
+ "dependencies": {
22
+ "@sandboxpm/store": "0.1.0",
23
+ "@sandboxpm/config": "0.1.0",
24
+ "@sandboxpm/fetcher": "0.1.0",
25
+ "@sandboxpm/resolver": "0.1.0"
26
+ },
27
+ "scripts": {
28
+ "build": "tsc --build",
29
+ "test": "vitest run"
30
+ }
31
+ }