@stablemodels/durable-bash 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.
@@ -0,0 +1,455 @@
1
+ import { DurableObject } from "cloudflare:workers";
2
+ import { EEXIST, EISDIR, ENOENT, ENOTDIR, ENOTEMPTY, FsError, } from "./errors.js";
3
+ const DIR_MODE = 0o755;
4
+ const FILE_MODE = 0o644;
5
+ const SYMLINK_MODE = 0o777;
6
+ /**
7
+ * Normalize a path: resolve `.` and `..`, remove trailing slashes, ensure leading `/`.
8
+ */
9
+ export function normalizePath(p) {
10
+ if (!p || p === "/")
11
+ return "/";
12
+ const parts = p.split("/");
13
+ const resolved = [];
14
+ for (const part of parts) {
15
+ if (part === "" || part === ".")
16
+ continue;
17
+ if (part === "..") {
18
+ resolved.pop();
19
+ }
20
+ else {
21
+ resolved.push(part);
22
+ }
23
+ }
24
+ return `/${resolved.join("/")}`;
25
+ }
26
+ function parentDir(p) {
27
+ const idx = p.lastIndexOf("/");
28
+ if (idx <= 0)
29
+ return "/";
30
+ return p.substring(0, idx);
31
+ }
32
+ function ancestors(p) {
33
+ const result = [];
34
+ let current = parentDir(p);
35
+ while (current !== "/") {
36
+ result.push(current);
37
+ current = parentDir(current);
38
+ }
39
+ result.push("/");
40
+ return result.reverse();
41
+ }
42
+ export class FsObject extends DurableObject {
43
+ sql;
44
+ constructor(ctx, env) {
45
+ super(ctx, env);
46
+ this.sql = ctx.storage.sql;
47
+ this.sql.exec(`
48
+ CREATE TABLE IF NOT EXISTS files (
49
+ path TEXT PRIMARY KEY,
50
+ content BLOB,
51
+ is_dir INTEGER NOT NULL DEFAULT 0,
52
+ mode INTEGER NOT NULL DEFAULT 420,
53
+ size INTEGER NOT NULL DEFAULT 0,
54
+ mtime_ms INTEGER NOT NULL,
55
+ symlink_target TEXT
56
+ )
57
+ `);
58
+ const root = this.sql
59
+ .exec("SELECT 1 FROM files WHERE path = '/'")
60
+ .toArray();
61
+ if (root.length === 0) {
62
+ this.sql.exec("INSERT INTO files (path, is_dir, mode, size, mtime_ms) VALUES ('/', 1, ?, 0, ?)", DIR_MODE, Date.now());
63
+ }
64
+ }
65
+ // ── Private helpers ──────────────────────────────────────────────
66
+ getRow(path) {
67
+ const rows = this.sql
68
+ .exec("SELECT * FROM files WHERE path = ?", path)
69
+ .toArray();
70
+ if (rows.length === 0)
71
+ return null;
72
+ return rows[0];
73
+ }
74
+ resolveSymlinks(path, maxDepth = 20) {
75
+ let current = path;
76
+ for (let i = 0; i < maxDepth; i++) {
77
+ const row = this.getRow(current);
78
+ if (!row)
79
+ throw ENOENT(path);
80
+ if (!row.symlink_target)
81
+ return current;
82
+ const target = row.symlink_target.startsWith("/")
83
+ ? normalizePath(row.symlink_target)
84
+ : normalizePath(`${parentDir(current)}/${row.symlink_target}`);
85
+ current = target;
86
+ }
87
+ throw new FsError("ELOOP", "too many levels of symbolic links", path);
88
+ }
89
+ /**
90
+ * Resolve path through symlinks if it exists and is a symlink, otherwise return as-is.
91
+ */
92
+ resolveTarget(normalized) {
93
+ const row = this.getRow(normalized);
94
+ if (row?.symlink_target) {
95
+ return this.resolveSymlinks(normalized);
96
+ }
97
+ return normalized;
98
+ }
99
+ ensureParentDirs(path) {
100
+ const dirs = ancestors(path);
101
+ const now = Date.now();
102
+ for (const dir of dirs) {
103
+ // INSERT OR IGNORE avoids the redundant SELECT per ancestor
104
+ this.sql.exec("INSERT OR IGNORE INTO files (path, is_dir, mode, size, mtime_ms) VALUES (?, 1, ?, 0, ?)", dir, DIR_MODE, now);
105
+ }
106
+ }
107
+ childPrefix(dirPath) {
108
+ return dirPath === "/" ? "/" : `${dirPath}/`;
109
+ }
110
+ toBytes(content) {
111
+ return typeof content === "string"
112
+ ? new TextEncoder().encode(content)
113
+ : content;
114
+ }
115
+ bufferToString(buf) {
116
+ return buf !== null ? new TextDecoder().decode(buf) : "";
117
+ }
118
+ bufferToUint8Array(buf) {
119
+ return buf !== null ? new Uint8Array(buf) : new Uint8Array(0);
120
+ }
121
+ extractChildName(fullPath, prefix) {
122
+ const rest = fullPath.substring(prefix.length);
123
+ const slashIdx = rest.indexOf("/");
124
+ const name = slashIdx === -1 ? rest : rest.substring(0, slashIdx);
125
+ return name || null;
126
+ }
127
+ ensureDirRow(path, row) {
128
+ if (!row)
129
+ throw ENOENT(path);
130
+ if (!row.is_dir)
131
+ throw ENOTDIR(path);
132
+ }
133
+ /**
134
+ * Insert or update a file entry.
135
+ */
136
+ upsertFile(path, data) {
137
+ const existing = this.getRow(path);
138
+ if (existing) {
139
+ this.sql.exec("UPDATE files SET content = ?, is_dir = ?, mode = ?, size = ?, mtime_ms = ?, symlink_target = ? WHERE path = ?", data.content, data.is_dir, data.mode, data.size, data.mtime_ms, data.symlink_target ?? null, path);
140
+ }
141
+ else {
142
+ this.ensureParentDirs(path);
143
+ this.sql.exec("INSERT INTO files (path, content, is_dir, mode, size, mtime_ms, symlink_target) VALUES (?, ?, ?, ?, ?, ?, ?)", path, data.content, data.is_dir, data.mode, data.size, data.mtime_ms, data.symlink_target ?? null);
144
+ }
145
+ }
146
+ // ── Public RPC methods ───────────────────────────────────────────
147
+ readFile(path) {
148
+ const resolved = this.resolveSymlinks(normalizePath(path));
149
+ const row = this.getRow(resolved);
150
+ if (!row)
151
+ throw ENOENT(path);
152
+ if (row.is_dir)
153
+ throw EISDIR(path);
154
+ return { content: this.bufferToString(row.content), encoding: "utf-8" };
155
+ }
156
+ readFileBuffer(path) {
157
+ const resolved = this.resolveSymlinks(normalizePath(path));
158
+ const row = this.getRow(resolved);
159
+ if (!row)
160
+ throw ENOENT(path);
161
+ if (row.is_dir)
162
+ throw EISDIR(path);
163
+ return { content: this.bufferToUint8Array(row.content) };
164
+ }
165
+ writeFile(path, content, opts) {
166
+ const normalized = normalizePath(path);
167
+ const bytes = this.toBytes(content);
168
+ const mode = opts?.mode ?? FILE_MODE;
169
+ const existing = this.getRow(normalized);
170
+ if (existing?.is_dir)
171
+ throw EISDIR(path);
172
+ const target = existing?.symlink_target
173
+ ? this.resolveSymlinks(normalized)
174
+ : normalized;
175
+ this.ensureParentDirs(target);
176
+ this.upsertFile(target, {
177
+ content: bytes,
178
+ is_dir: 0,
179
+ mode,
180
+ size: bytes.byteLength,
181
+ mtime_ms: Date.now(),
182
+ });
183
+ }
184
+ appendFile(path, content) {
185
+ const normalized = normalizePath(path);
186
+ const target = this.resolveTarget(normalized);
187
+ const row = this.getRow(target);
188
+ const appendBytes = this.toBytes(content);
189
+ if (!row) {
190
+ this.ensureParentDirs(target);
191
+ this.sql.exec("INSERT INTO files (path, content, is_dir, mode, size, mtime_ms) VALUES (?, ?, 0, ?, ?, ?)", target, appendBytes, FILE_MODE, appendBytes.byteLength, Date.now());
192
+ }
193
+ else {
194
+ if (row.is_dir)
195
+ throw EISDIR(path);
196
+ const existing = this.bufferToUint8Array(row.content);
197
+ const combined = new Uint8Array(existing.byteLength + appendBytes.byteLength);
198
+ combined.set(existing, 0);
199
+ combined.set(appendBytes, existing.byteLength);
200
+ this.sql.exec("UPDATE files SET content = ?, size = ?, mtime_ms = ? WHERE path = ?", combined, combined.byteLength, Date.now(), target);
201
+ }
202
+ }
203
+ exists(path) {
204
+ return this.getRow(normalizePath(path)) !== null;
205
+ }
206
+ stat(path) {
207
+ const resolved = this.resolveSymlinks(normalizePath(path));
208
+ const row = this.getRow(resolved);
209
+ if (!row)
210
+ throw ENOENT(path);
211
+ return {
212
+ isDir: row.is_dir === 1,
213
+ isSymlink: false,
214
+ size: row.size,
215
+ mode: row.mode,
216
+ mtimeMs: row.mtime_ms,
217
+ };
218
+ }
219
+ lstat(path) {
220
+ const normalized = normalizePath(path);
221
+ const row = this.getRow(normalized);
222
+ if (!row)
223
+ throw ENOENT(path);
224
+ return {
225
+ isDir: row.is_dir === 1,
226
+ isSymlink: row.symlink_target !== null,
227
+ size: row.size,
228
+ mode: row.mode,
229
+ mtimeMs: row.mtime_ms,
230
+ };
231
+ }
232
+ mkdir(path, opts) {
233
+ const normalized = normalizePath(path);
234
+ const existing = this.getRow(normalized);
235
+ if (existing) {
236
+ if (existing.is_dir && opts?.recursive)
237
+ return;
238
+ throw EEXIST(path);
239
+ }
240
+ if (opts?.recursive) {
241
+ this.ensureParentDirs(normalized);
242
+ }
243
+ else {
244
+ const parent = parentDir(normalized);
245
+ const parentRow = this.getRow(parent);
246
+ if (!parentRow)
247
+ throw ENOENT(parent);
248
+ if (!parentRow.is_dir)
249
+ throw ENOTDIR(parent);
250
+ }
251
+ this.sql.exec("INSERT INTO files (path, is_dir, mode, size, mtime_ms) VALUES (?, 1, ?, 0, ?)", normalized, DIR_MODE, Date.now());
252
+ }
253
+ readdir(path) {
254
+ const normalized = normalizePath(path);
255
+ const row = this.getRow(normalized);
256
+ this.ensureDirRow(path, row);
257
+ const prefix = this.childPrefix(normalized);
258
+ const rows = this.sql
259
+ .exec("SELECT path FROM files WHERE path != ? AND path LIKE ?", normalized, `${prefix}%`)
260
+ .toArray();
261
+ const names = new Set();
262
+ for (const r of rows) {
263
+ const name = this.extractChildName(r.path, prefix);
264
+ if (name)
265
+ names.add(name);
266
+ }
267
+ return [...names].sort();
268
+ }
269
+ readdirWithFileTypes(path) {
270
+ const normalized = normalizePath(path);
271
+ const row = this.getRow(normalized);
272
+ this.ensureDirRow(path, row);
273
+ const prefix = this.childPrefix(normalized);
274
+ const rows = this.sql
275
+ .exec("SELECT path, is_dir, symlink_target FROM files WHERE path != ? AND path LIKE ?", normalized, `${prefix}%`)
276
+ .toArray();
277
+ const entries = new Map();
278
+ for (const r of rows) {
279
+ const fullPath = r.path;
280
+ const rest = fullPath.substring(prefix.length);
281
+ const slashIdx = rest.indexOf("/");
282
+ const name = slashIdx === -1 ? rest : rest.substring(0, slashIdx);
283
+ if (!name || entries.has(name))
284
+ continue;
285
+ if (slashIdx !== -1) {
286
+ entries.set(name, {
287
+ name,
288
+ isFile: false,
289
+ isDirectory: true,
290
+ isSymlink: false,
291
+ });
292
+ }
293
+ else {
294
+ const isDir = r.is_dir === 1;
295
+ const isSymlink = r.symlink_target !== null;
296
+ entries.set(name, {
297
+ name,
298
+ isFile: !isDir && !isSymlink,
299
+ isDirectory: isDir,
300
+ isSymlink,
301
+ });
302
+ }
303
+ }
304
+ return [...entries.values()].sort((a, b) => a.name.localeCompare(b.name));
305
+ }
306
+ rm(path, opts) {
307
+ const normalized = normalizePath(path);
308
+ const row = this.getRow(normalized);
309
+ if (!row) {
310
+ if (opts?.force)
311
+ return;
312
+ throw ENOENT(path);
313
+ }
314
+ if (row.is_dir) {
315
+ const prefix = this.childPrefix(normalized);
316
+ const children = this.sql
317
+ .exec("SELECT 1 FROM files WHERE path LIKE ? LIMIT 1", `${prefix}%`)
318
+ .toArray();
319
+ if (children.length > 0) {
320
+ if (!opts?.recursive)
321
+ throw ENOTEMPTY(path);
322
+ this.sql.exec("DELETE FROM files WHERE path LIKE ?", `${prefix}%`);
323
+ }
324
+ }
325
+ this.sql.exec("DELETE FROM files WHERE path = ?", normalized);
326
+ }
327
+ cp(src, dest, opts) {
328
+ const srcNorm = this.resolveSymlinks(normalizePath(src));
329
+ const destNorm = normalizePath(dest);
330
+ const srcRow = this.getRow(srcNorm);
331
+ if (!srcRow)
332
+ throw ENOENT(src);
333
+ const now = Date.now();
334
+ if (srcRow.is_dir) {
335
+ if (!opts?.recursive)
336
+ throw EISDIR(src);
337
+ const prefix = this.childPrefix(srcNorm);
338
+ const rows = this.sql
339
+ .exec("SELECT * FROM files WHERE path = ? OR path LIKE ?", srcNorm, `${prefix}%`)
340
+ .toArray();
341
+ this.ensureParentDirs(destNorm);
342
+ for (const r of rows) {
343
+ const rPath = r.path;
344
+ const relativePath = rPath === srcNorm ? "" : rPath.substring(srcNorm.length);
345
+ this.upsertFile(destNorm + relativePath, {
346
+ content: r.content,
347
+ is_dir: r.is_dir,
348
+ mode: r.mode,
349
+ size: r.size,
350
+ mtime_ms: now,
351
+ symlink_target: r.symlink_target,
352
+ });
353
+ }
354
+ }
355
+ else {
356
+ this.upsertFile(destNorm, {
357
+ content: srcRow.content,
358
+ is_dir: 0,
359
+ mode: srcRow.mode,
360
+ size: srcRow.size,
361
+ mtime_ms: now,
362
+ });
363
+ }
364
+ }
365
+ mv(src, dest) {
366
+ const srcNorm = normalizePath(src);
367
+ const destNorm = normalizePath(dest);
368
+ const srcRow = this.getRow(srcNorm);
369
+ if (!srcRow)
370
+ throw ENOENT(src);
371
+ this.ensureParentDirs(destNorm);
372
+ const now = Date.now();
373
+ if (srcRow.is_dir) {
374
+ const prefix = this.childPrefix(srcNorm);
375
+ const rows = this.sql
376
+ .exec("SELECT path FROM files WHERE path LIKE ?", `${prefix}%`)
377
+ .toArray();
378
+ // All descendants share the same new parent prefix — the directory
379
+ // entry itself (moved below) covers the intermediate dirs, so no
380
+ // per-child ensureParentDirs is needed.
381
+ for (const r of rows) {
382
+ const rPath = r.path;
383
+ const newPath = destNorm + rPath.substring(srcNorm.length);
384
+ this.sql.exec("UPDATE files SET path = ?, mtime_ms = ? WHERE path = ?", newPath, now, rPath);
385
+ }
386
+ }
387
+ const existing = this.getRow(destNorm);
388
+ if (existing) {
389
+ this.sql.exec("DELETE FROM files WHERE path = ?", destNorm);
390
+ }
391
+ this.sql.exec("UPDATE files SET path = ?, mtime_ms = ? WHERE path = ?", destNorm, now, srcNorm);
392
+ }
393
+ chmod(path, mode) {
394
+ const resolved = this.resolveSymlinks(normalizePath(path));
395
+ const row = this.getRow(resolved);
396
+ if (!row)
397
+ throw ENOENT(path);
398
+ this.sql.exec("UPDATE files SET mode = ? WHERE path = ?", mode, resolved);
399
+ }
400
+ symlink(target, linkPath) {
401
+ const normalized = normalizePath(linkPath);
402
+ const existing = this.getRow(normalized);
403
+ if (existing)
404
+ throw EEXIST(linkPath);
405
+ this.ensureParentDirs(normalized);
406
+ this.sql.exec("INSERT INTO files (path, is_dir, mode, size, mtime_ms, symlink_target) VALUES (?, 0, ?, 0, ?, ?)", normalized, SYMLINK_MODE, Date.now(), target);
407
+ }
408
+ /**
409
+ * Create a hard link. Note: this copies content at call time rather than
410
+ * sharing underlying storage — subsequent writes to one path will not
411
+ * update the other. This matches the IFileSystem contract but differs
412
+ * from POSIX hard link semantics.
413
+ */
414
+ link(existingPath, newPath) {
415
+ const existingNorm = this.resolveSymlinks(normalizePath(existingPath));
416
+ const newNorm = normalizePath(newPath);
417
+ const srcRow = this.getRow(existingNorm);
418
+ if (!srcRow)
419
+ throw ENOENT(existingPath);
420
+ if (srcRow.is_dir)
421
+ throw EISDIR(existingPath);
422
+ const destRow = this.getRow(newNorm);
423
+ if (destRow)
424
+ throw EEXIST(newPath);
425
+ this.ensureParentDirs(newNorm);
426
+ this.sql.exec("INSERT INTO files (path, content, is_dir, mode, size, mtime_ms) VALUES (?, ?, 0, ?, ?, ?)", newNorm, srcRow.content, srcRow.mode, srcRow.size, Date.now());
427
+ }
428
+ readlink(path) {
429
+ const normalized = normalizePath(path);
430
+ const row = this.getRow(normalized);
431
+ if (!row)
432
+ throw ENOENT(path);
433
+ if (!row.symlink_target) {
434
+ throw new FsError("EINVAL", "invalid argument", path);
435
+ }
436
+ return row.symlink_target;
437
+ }
438
+ realpath(path) {
439
+ return this.resolveSymlinks(normalizePath(path));
440
+ }
441
+ utimes(path, _atimeMs, mtimeMs) {
442
+ const resolved = this.resolveSymlinks(normalizePath(path));
443
+ const row = this.getRow(resolved);
444
+ if (!row)
445
+ throw ENOENT(path);
446
+ this.sql.exec("UPDATE files SET mtime_ms = ? WHERE path = ?", mtimeMs, resolved);
447
+ }
448
+ getAllPaths() {
449
+ const rows = this.sql
450
+ .exec("SELECT path FROM files ORDER BY path")
451
+ .toArray();
452
+ return rows.map((r) => r.path);
453
+ }
454
+ }
455
+ //# sourceMappingURL=fs-object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-object.js","sourceRoot":"","sources":["../src/fs-object.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { DurableFs } from "./durable-fs.js";
2
+ export type { FsStat, DirentEntry } from "./durable-fs.js";
3
+ export { FsObject, normalizePath } from "./fs-object.js";
4
+ export { FsError, ENOENT, EEXIST, EISDIR, ENOTDIR, ENOTEMPTY, } from "./errors.js";
5
+ export type { FsStatData, DirentData } from "./types.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACN,OAAO,EACP,MAAM,EACN,MAAM,EACN,MAAM,EACN,OAAO,EACP,SAAS,GACT,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { DurableFs } from "./durable-fs.js";
2
+ export { FsObject, normalizePath } from "./fs-object.js";
3
+ export { FsError, ENOENT, EEXIST, EISDIR, ENOTDIR, ENOTEMPTY, } from "./errors.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACN,OAAO,EACP,MAAM,EACN,MAAM,EACN,MAAM,EACN,OAAO,EACP,SAAS,GACT,MAAM,aAAa,CAAC"}
@@ -0,0 +1,16 @@
1
+ /** Wire format for stat results (serializable over RPC) */
2
+ export interface FsStatData {
3
+ isDir: boolean;
4
+ isSymlink: boolean;
5
+ size: number;
6
+ mode: number;
7
+ mtimeMs: number;
8
+ }
9
+ /** Wire format for directory entries (serializable over RPC) */
10
+ export interface DirentData {
11
+ name: string;
12
+ isFile: boolean;
13
+ isDirectory: boolean;
14
+ isSymlink: boolean;
15
+ }
16
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,WAAW,UAAU;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,gEAAgE;AAChE,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACnB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# 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,35 @@
1
+ {
2
+ "name": "@stablemodels/durable-bash",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": "./dist/index.js",
9
+ "./object": "./dist/fs-object.js"
10
+ },
11
+ "peerDependencies": {
12
+ "just-bash": "^1.0.0",
13
+ "@cloudflare/workers-types": "^4.0.0"
14
+ },
15
+ "devDependencies": {
16
+ "just-bash": "^1.0.0",
17
+ "bash-tool": "^1.3.1",
18
+ "@cloudflare/workers-types": "^4.20250214.0",
19
+ "typescript": "^5.7.0",
20
+ "@biomejs/biome": "1.9.4",
21
+ "wrangler": "^4.0.0"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "https://github.com/StableModels/durable-bash"
26
+ },
27
+ "scripts": {
28
+ "build": "tsc",
29
+ "check": "biome check .",
30
+ "format": "biome check --write .",
31
+ "test": "bun test",
32
+ "test:unit": "bun test tests/durable-fs.test.ts tests/fs-object.test.ts",
33
+ "test:integration": "bun test tests/integration.test.ts tests/just-bash.test.ts"
34
+ }
35
+ }