diff --git a/deno.json b/deno.json new file mode 100644 index 0000000..45d10d5 --- /dev/null +++ b/deno.json @@ -0,0 +1,61 @@ +{ + "name": "@okikio/opfs", + "version": "0.0.1", + "exports": { + ".": "./mod.ts", + "./adapter": "./src/adapter/definition.ts", + "./adapter/opfs": "./src/adapter/opfs.ts", + "./adapter/memory": "./src/adapter/memory.ts", + "./adapter/deno": "./src/adapter/deno.ts", + "./adapter/node": "./src/adapter/node.ts", + "./adapter/bun": "./src/adapter/bun.ts", + "./adapter/record": "./src/adapter/record.ts", + "./adapter/unstorage": "./src/adapter/unstorage.ts", + "./adapter/rxdb": "./src/adapter/rxdb.ts", + "./adapter/db0": "./src/adapter/db0.ts", + "./adapter/drizzle": "./src/adapter/drizzle.ts", + "./driver/unstorage": "./src/driver/unstorage.ts", + "./iframe": "./src/iframe.ts", + "./path": "./src/path.ts", + "./schema": "./src/schema.ts" + }, + "imports": { + "zod": "npm:zod@^4.4.3", + "drizzle-orm": "npm:drizzle-orm@^0.45.3" + }, + "compilerOptions": { + "types": ["npm:@types/node"], + "strict": true, + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + "useUnknownInCatchVariables": true, + "verbatimModuleSyntax": true, + "lib": [ + "dom", + "dom.iterable", + "dom.asynciterable", + "deno.ns" + ] + }, + "tasks": { + "check": "deno task check:window && deno task check:worker && deno task check:server", + "check:window": "deno check mod.ts src/adapter/definition.ts src/adapter/opfs.ts src/adapter/memory.ts src/adapter/record.ts src/adapter/unstorage.ts src/adapter/rxdb.ts src/adapter/db0.ts src/adapter/drizzle.ts src/driver/unstorage.ts src/iframe.ts src/path.ts src/schema.ts", + "check:worker": "deno check tests/worker_typecheck.ts", + "check:server": "deno check src/adapter/deno.ts src/adapter/node.ts src/adapter/bun.ts", + "test": "deno test tests/", + "test:browser": "deno run -A npm:vite tests/browser", + "fmt:code": "deno fmt mod.ts src/ tests/ deno.json package.json", + "fmt:check": "deno fmt --check mod.ts src/ tests/ deno.json package.json", + "lint": "deno lint mod.ts src/ tests/" + }, + "publish": { + "include": [ + "mod.ts", + "src/", + "README.md", + "docs/", + "deno.json", + "package.json" + ] + } +} diff --git a/deno.jsonc b/deno.jsonc deleted file mode 100644 index cfc665d..0000000 --- a/deno.jsonc +++ /dev/null @@ -1,41 +0,0 @@ -{ - "nodeModulesDir": "manual", - "workspace": ["packages/media/*", "utils/*"], - "exports": {}, - "imports": { - "@logtape/logtape": "jsr:@logtape/logtape@^2.3.0", - "@okikio/observables": "jsr:@okikio/observables@1.4.0", - "@okikio/undent": "jsr:@okikio/undent@0.3.3", - "@std/async": "jsr:@std/async@^1.5.0", - "@std/encoding": "jsr:@std/encoding@^1.0.11", - "@std/expect": "npm:@jsr/std__expect@1.0.20", - "@std/media-types": "jsr:@std/media-types@^1.1.0", - "mediabunny": "npm:mediabunny@^1.53.0", - "zod": "npm:zod@4.4.3" - }, - "compilerOptions": { - "lib": ["deno.window", "dom", "dom.iterable"], - "types": ["npm:@types/node"], - "strict": true, - "noImplicitOverride": true, - "noUncheckedIndexedAccess": true, - "verbatimModuleSyntax": true - }, - "tasks": { - "check:media": "deno check packages/media/*/mod.ts packages/media/*/mod_test.ts", - "test:media": "deno test packages/media/*/mod_test.ts" - }, - "fmt": { - "lineWidth": 120, - "semiColons": true, - "singleQuote": true, - "useTabs": true, - "indentWidth": 2 - }, - "lint": { - "rules": { - "tags": ["recommended"], - "exclude": ["no-slow-types", "require-await"] - } - } -} diff --git a/deno.lock b/deno.lock index 4633003..096894b 100644 --- a/deno.lock +++ b/deno.lock @@ -1,153 +1,5 @@ { "version": "5", - "specifiers": { - "jsr:@hono/hono@^4.13.1": "4.13.1", - "jsr:@logtape/logtape@^2.3.0": "2.3.0", - "jsr:@okikio/observables@1.4.0": "1.4.0", - "jsr:@okikio/undent@0.3.3": "0.3.3", - "jsr:@standard-schema/spec@^1.1.0": "1.1.0", - "jsr:@std/assert@^1.0.19": "1.0.19", - "jsr:@std/async@^1.5.0": "1.5.0", - "jsr:@std/bytes@^1.0.6": "1.0.6", - "jsr:@std/cli@^1.0.32": "1.0.32", - "jsr:@std/csv@^1.0.6": "1.0.6", - "jsr:@std/data-structures@^1.1.1": "1.1.2", - "jsr:@std/encoding@^1.0.11": "1.0.11", - "jsr:@std/expect@^1.0.20": "1.0.20", - "jsr:@std/fmt@^1.0.10": "1.0.10", - "jsr:@std/fs@^1.0.24": "1.0.24", - "jsr:@std/html@^1.0.7": "1.0.7", - "jsr:@std/http@^1.1.3": "1.1.3", - "jsr:@std/internal@^1.0.12": "1.0.14", - "jsr:@std/internal@^1.0.14": "1.0.14", - "jsr:@std/media-types@^1.1.0": "1.1.0", - "jsr:@std/net@^1.0.6": "1.0.6", - "jsr:@std/path@^1.1.6": "1.1.6", - "jsr:@std/streams@^1.0.9": "1.1.2", - "jsr:@std/streams@^1.1.2": "1.1.2", - "npm:@jsr/okikio__observables@^1.4.0": "1.4.0", - "npm:@jsr/okikio__undent@~0.3.3": "0.3.3", - "npm:@jsr/std__async@^1.5.0": "1.5.0", - "npm:@jsr/std__csv@^1.0.6": "1.0.6", - "npm:@jsr/std__encoding@^1.0.11": "1.0.11", - "npm:@jsr/std__expect@1.0.20": "1.0.20", - "npm:@jsr/std__expect@^1.0.20": "1.0.20", - "npm:@jsr/std__http@^1.1.3": "1.1.3", - "npm:@jsr/std__media-types@^1.1.0": "1.1.0", - "npm:@logtape/logtape@2": "2.3.0", - "npm:@okikio/observables@^1.4.0": "1.4.0", - "npm:@standard-schema/spec@1.1.0": "1.1.0", - "npm:@standard-schema/spec@^1.1.0": "1.1.0", - "npm:@types/node@*": "26.2.0", - "npm:@types/node@^26.2.0": "26.2.0", - "npm:fast-check@^4.9.0": "4.9.0", - "npm:hono@^4.13.1": "4.13.1", - "npm:mediabunny@^1.53.0": "1.53.0", - "npm:mitata@^1.0.34": "1.0.34", - "npm:typescript@^7.0.2": "7.0.2", - "npm:valibot@^1.4.2": "1.4.2_typescript@7.0.2", - "npm:zod@4.4.3": "4.4.3", - "npm:zod@^4.4.3": "4.4.3" - }, - "jsr": { - "@hono/hono@4.13.1": { - "integrity": "36e130f7c3a07d2938d0960c3c726e71ff15becdf999512949bc69884b6afb65" - }, - "@logtape/logtape@2.3.0": { - "integrity": "e9892e428b9712ddd050d53d859fa539d9a308d7b00cfcb54213e8da513b24e0" - }, - "@okikio/observables@1.4.0": { - "integrity": "430c5c2db456cb10202a59ac4e0de8dda2bd89f2c6e3311af3153008c495e6cd" - }, - "@okikio/undent@0.3.3": { - "integrity": "890c688327fe4defc917ace44f8e9de85322881aed43d3c24176e530f86b18fa" - }, - "@standard-schema/spec@1.1.0": { - "integrity": "2ccd54513cd9c960bd155ab569b1a901bc99c6f9ad29559d3f38a28c91c1822d" - }, - "@std/assert@1.0.19": { - "integrity": "eaada96ee120cb980bc47e040f82814d786fe8162ecc53c91d8df60b8755991e", - "dependencies": [ - "jsr:@std/internal@^1.0.12" - ] - }, - "@std/async@1.5.0": { - "integrity": "4c1f22d287a17ad7d8643b1952bc5a4d21e5d8b68dc8c20d8268eecc69096e82", - "dependencies": [ - "jsr:@std/data-structures" - ] - }, - "@std/bytes@1.0.6": { - "integrity": "f6ac6adbd8ccd99314045f5703e23af0a68d7f7e58364b47d2c7f408aeb5820a" - }, - "@std/cli@1.0.32": { - "integrity": "188b3a100d6202d64e3f5bd3d799c7fa4f6d77f92cc65eb7f641c1fa0aa92a66" - }, - "@std/csv@1.0.6": { - "integrity": "52ef0e62799a0028d278fa04762f17f9bd263fad9a8e7f98c14fbd371d62d9fd", - "dependencies": [ - "jsr:@std/streams@^1.0.9" - ] - }, - "@std/data-structures@1.1.2": { - "integrity": "2471377c9e0051f9ec34e57d0ebd0ad133a5a889677446ec6ba9938e4e102918" - }, - "@std/encoding@1.0.11": { - "integrity": "e7cef2f0b3153bccc17431e7c864a1de03a4b6d9647389c43e08aaa775d37385" - }, - "@std/expect@1.0.20": { - "integrity": "ffc4f3c33f732417e3e9acf3d995818c89984313c37d933b9ebbb4571d2887e9", - "dependencies": [ - "jsr:@std/assert", - "jsr:@std/internal@^1.0.14", - "jsr:@std/path" - ] - }, - "@std/fmt@1.0.10": { - "integrity": "90dfba288802ac6de82fb31d0917eb9e4450b9925b954d5e51fc29ac07419db5" - }, - "@std/fs@1.0.24": { - "integrity": "f3061b45b81673a2bece689da041df32d174be064c89eb6397fb5718d3fb7877" - }, - "@std/html@1.0.7": { - "integrity": "175c818905a6e75743c69c251395e273d82698e58cfe7dd76268d70e28b8d8fe" - }, - "@std/http@1.1.3": { - "integrity": "73a98e05ff58aa18bea562d286172e6c815b1eddd4fcab194beda19e3683b88c", - "dependencies": [ - "jsr:@std/cli", - "jsr:@std/encoding", - "jsr:@std/fmt", - "jsr:@std/fs", - "jsr:@std/html", - "jsr:@std/media-types", - "jsr:@std/net", - "jsr:@std/path", - "jsr:@std/streams@^1.1.2" - ] - }, - "@std/internal@1.0.14": { - "integrity": "291516b3d4c35024d6ffbc0a9df5bf4c64116e05b50012cf846710152d2ffdf7" - }, - "@std/media-types@1.1.0": { - "integrity": "c9d093f0c05c3512932b330e3cc1fe1d627b301db33a4c2c2185c02471d6eaa4" - }, - "@std/net@1.0.6": { - "integrity": "110735f93e95bb9feb95790a8b1d1bf69ec0dc74f3f97a00a76ea5efea25500c" - }, - "@std/path@1.1.6": { - "integrity": "c68485c2a4dfbb5ae3cc74fae4e8c4e5d874cf8a8ed12927917235c758b46cbe", - "dependencies": [ - "jsr:@std/internal@^1.0.14" - ] - }, - "@std/streams@1.1.2": { - "integrity": "0249bf9b78a999f57032ca4d8e7ccaa57579090242640b35ddc948fbb745d3af", - "dependencies": [ - "jsr:@std/bytes" - ] - } - }, "npm": { "@jsr/okikio__observables@1.4.0": { "integrity": "sha512-T+1X935k3q95Nyya342MbSejZDNoqFFi/T/7TJ+IlwPezIAdCdguD6UoJc17R3zjvrMiRjnUTGsaJ8MFeDsgYQ==", @@ -457,299 +309,15 @@ }, "workspace": { "dependencies": [ - "jsr:@logtape/logtape@^2.3.0", - "jsr:@okikio/observables@1.4.0", - "jsr:@okikio/undent@0.3.3", - "jsr:@std/async@^1.5.0", - "jsr:@std/encoding@^1.0.11", - "jsr:@std/media-types@^1.1.0", - "npm:@jsr/std__expect@1.0.20", - "npm:@types/node@*", - "npm:mediabunny@^1.53.0", - "npm:zod@4.4.3" + "npm:drizzle-orm@~0.45.3", + "npm:zod@^4.4.3" ], "packageJson": { "dependencies": [ - "npm:@jsr/okikio__observables@^1.4.0", - "npm:@jsr/okikio__undent@~0.3.3", - "npm:@jsr/std__async@^1.5.0", - "npm:@jsr/std__encoding@^1.0.11", - "npm:@jsr/std__expect@1.0.20", - "npm:@jsr/std__media-types@^1.1.0", - "npm:@logtape/logtape@2", - "npm:@types/node@^26.2.0", - "npm:mediabunny@^1.53.0", - "npm:typescript@^7.0.2", + "npm:@deno/shim-deno@~0.19.2", + "npm:@types/deno@^2.7.0", "npm:zod@^4.4.3" ] - }, - "members": { - "utils/activity": { - "dependencies": [ - "jsr:@standard-schema/spec@^1.1.0", - "jsr:@std/expect@^1.0.20" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__expect@^1.0.20", - "npm:@standard-schema/spec@^1.1.0" - ] - } - }, - "utils/catalog": { - "dependencies": [ - "jsr:@std/expect@^1.0.20" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__expect@^1.0.20" - ] - } - }, - "utils/codec": { - "dependencies": [ - "jsr:@std/expect@^1.0.20", - "npm:@standard-schema/spec@1.1.0" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__expect@^1.0.20", - "npm:@standard-schema/spec@^1.1.0" - ] - } - }, - "utils/context": { - "dependencies": [ - "jsr:@std/expect@^1.0.20" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__expect@^1.0.20" - ] - } - }, - "utils/csv": { - "dependencies": [ - "jsr:@std/csv@^1.0.6", - "jsr:@std/expect@^1.0.20" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__csv@^1.0.6", - "npm:@jsr/std__expect@^1.0.20" - ] - } - }, - "utils/email": { - "dependencies": [ - "jsr:@std/expect@^1.0.20" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__expect@^1.0.20" - ] - } - }, - "utils/env": { - "dependencies": [ - "jsr:@std/expect@^1.0.20", - "npm:@standard-schema/spec@^1.1.0", - "npm:fast-check@^4.9.0", - "npm:mitata@^1.0.34", - "npm:valibot@^1.4.2", - "npm:zod@^4.4.3" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__expect@^1.0.20", - "npm:@standard-schema/spec@^1.1.0", - "npm:fast-check@^4.9.0", - "npm:mitata@^1.0.34", - "npm:valibot@^1.4.2", - "npm:zod@^4.4.3" - ] - } - }, - "utils/failure": { - "dependencies": [ - "jsr:@std/expect@^1.0.20", - "npm:@standard-schema/spec@1.1.0" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__expect@^1.0.20", - "npm:@standard-schema/spec@^1.1.0" - ] - } - }, - "utils/http": { - "dependencies": [ - "jsr:@standard-schema/spec@^1.1.0", - "jsr:@std/encoding@^1.0.11", - "jsr:@std/expect@^1.0.20", - "jsr:@std/http@^1.1.3" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__encoding@^1.0.11", - "npm:@jsr/std__expect@^1.0.20", - "npm:@jsr/std__http@^1.1.3", - "npm:@standard-schema/spec@^1.1.0" - ] - } - }, - "utils/pool": { - "dependencies": [ - "jsr:@okikio/observables@1.4.0", - "jsr:@std/expect@^1.0.20" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__expect@^1.0.20", - "npm:@okikio/observables@^1.4.0" - ] - } - }, - "utils/process": { - "dependencies": [ - "jsr:@okikio/observables@1.4.0", - "jsr:@std/expect@^1.0.20" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__expect@^1.0.20", - "npm:@okikio/observables@^1.4.0" - ] - } - }, - "utils/query": { - "dependencies": [ - "jsr:@standard-schema/spec@^1.1.0", - "jsr:@std/expect@^1.0.20" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__expect@^1.0.20", - "npm:@standard-schema/spec@^1.1.0" - ] - } - }, - "utils/queue": { - "dependencies": [ - "jsr:@okikio/observables@1.4.0", - "jsr:@std/expect@^1.0.20" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__expect@^1.0.20", - "npm:@okikio/observables@^1.4.0" - ] - } - }, - "utils/resilience": { - "dependencies": [ - "jsr:@std/expect@^1.0.20" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__expect@^1.0.20" - ] - } - }, - "utils/resource": { - "dependencies": [ - "jsr:@std/expect@^1.0.20" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__expect@^1.0.20" - ] - } - }, - "utils/result": { - "dependencies": [ - "jsr:@std/expect@^1.0.20" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__expect@^1.0.20" - ] - } - }, - "utils/runtime": { - "dependencies": [ - "jsr:@std/expect@^1.0.20" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__expect@^1.0.20" - ] - } - }, - "utils/schema": { - "dependencies": [ - "jsr:@std/expect@^1.0.20", - "npm:@standard-schema/spec@1.1.0" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__expect@^1.0.20", - "npm:@standard-schema/spec@^1.1.0" - ] - } - }, - "utils/server": { - "dependencies": [ - "jsr:@hono/hono@^4.13.1", - "jsr:@standard-schema/spec@^1.1.0", - "jsr:@std/async@^1.5.0", - "jsr:@std/expect@^1.0.20" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__async@^1.5.0", - "npm:@jsr/std__expect@^1.0.20", - "npm:@standard-schema/spec@^1.1.0", - "npm:hono@^4.13.1" - ] - } - }, - "utils/streams": { - "dependencies": [ - "jsr:@std/expect@^1.0.20" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__expect@^1.0.20" - ] - } - }, - "utils/worker": { - "dependencies": [ - "jsr:@okikio/observables@1.4.0", - "jsr:@standard-schema/spec@^1.1.0", - "jsr:@std/expect@^1.0.20" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__expect@^1.0.20", - "npm:@okikio/observables@^1.4.0", - "npm:@standard-schema/spec@^1.1.0" - ] - } - }, - "utils/workflow": { - "dependencies": [ - "jsr:@standard-schema/spec@^1.1.0", - "jsr:@std/expect@^1.0.20" - ], - "packageJson": { - "dependencies": [ - "npm:@jsr/std__expect@^1.0.20", - "npm:@standard-schema/spec@^1.1.0" - ] - } - } } } } diff --git a/mod.ts b/mod.ts new file mode 100644 index 0000000..391d6da --- /dev/null +++ b/mod.ts @@ -0,0 +1,86 @@ +/** + * Adapter-independent filesystem APIs with an OPFS-compatible frontend. + * + * The package has two independent layers: + * + * 1. `createFileSystem(adapter)` provides high-level path APIs and OPFS-shaped + * file/directory handle facades over any backend adapter. + * 2. `openFileSystem()` selects the browser's native Origin Private File System + * as that backend. + * + * Runtime-specific and ecosystem adapters live on explicit subpaths so browser + * bundles do not import Node, Bun, Deno, RxDB, unstorage, db0, or Drizzle by + * accident. + * + * @example Use native browser OPFS. + * ```ts + * import { openFileSystem } from "@okikio/opfs"; + * + * const fileSystem = await openFileSystem(); + * await fileSystem.writeFile("/cache/result.json", "{}", { parents: true }); + * ``` + * + * @example Use the same frontend over an injected adapter. + * ```ts + * import { createFileSystem } from "@okikio/opfs"; + * import { createMemoryAdapter } from "@okikio/opfs/adapter/memory"; + * + * const fileSystem = createFileSystem(createMemoryAdapter()); + * const file = await fileSystem.root.getFileHandle("hello.txt", { create: true }); + * const writable = await file.createWritable(); + * await writable.write("hello"); + * await writable.close(); + * ``` + * + * @module + */ + +export { createFileSystem } from "./src/filesystem.ts"; +export { openFileSystem } from "./src/adapter/opfs.ts"; +export { FileSystemError, getErrorMessage, getErrorName, toFileSystemError } from "./src/error.ts"; +export { getOpfsContext } from "./src/context.ts"; +export { probeOpfs } from "./src/probe.ts"; +export type { + CopyOptionsType, + DirectoryEntryType, + DirectoryOptionsType, + DirectoryStatType, + EmptyDirectoryOptionsType, + ExistsOptionsType, + FileOptionsType, + FileStatType, + FileSystemType, + MakeDirectoryOptionsType, + MoveOptionsType, + OpenSyncFileOptionsType, + ReadOptionsType, + ReadTextOptionsType, + RemoveOptionsType, + SignalOptionsType, + StatType, + WalkEntryType, + WalkOptionsType, + WriteOptionsType, +} from "./src/filesystem.ts"; +export type { + DirectoryHandleType, + FileHandleType, + HandleCreateOptionsType, + HandleRemoveOptionsType, + HandleType, + WritableChunkType, + WritableFileStreamType, + WriteCommandType, +} from "./src/handle.ts"; +export type { SyncFileType } from "./src/sync.ts"; +export type { WriteDataType } from "./src/stream.ts"; +export type { + AdapterCapabilitiesType, + CoordinationModeType, + EntryKindType, + ErrorCodeType, + OpfsContextType, + WriteModeType, +} from "./src/schema.ts"; +export type { FileSystemOptionsType } from "./src/adapter/definition.ts"; +export type { OpfsCapabilitiesType, OpfsProbeErrorType, OpfsStorageEstimateType } from "./src/probe.ts"; diff --git a/package.json b/package.json index 4e64e9f..ac16919 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ ], "devDependencies": { "@deno/shim-deno": "^0.19.2", - "@types/deno": "^2.7.0" + "@types/deno": "^2.7.0", + "@types/sharedworker": "^0.0.229" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 49f226f..05202fc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,6 +18,9 @@ importers: '@types/deno': specifier: ^2.7.0 version: 2.7.0 + '@types/sharedworker': + specifier: ^0.0.229 + version: 0.0.229 packages: @@ -30,6 +33,9 @@ packages: '@types/deno@2.7.0': resolution: {integrity: sha512-Y6fWcV8KpYeO3Lik/RiYnUxtr/LWqoeACciU0CA+dr1U/45tGgaX3HWQQAPCNN53raN4Rr4Fht4y6qsUH57fDA==} + '@types/sharedworker@0.0.229': + resolution: {integrity: sha512-0gPmMzELgb8NngUbvfpWgE73h2jY5zpHrUOswFFcqXFpmbTWEzvJtaB1ZYxv8u4HRJStgwoFtXDFefQwL24Sxg==} + isexe@3.1.5: resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} engines: {node: '>=18'} @@ -53,6 +59,8 @@ snapshots: '@types/deno@2.7.0': {} + '@types/sharedworker@0.0.229': {} + isexe@3.1.5: {} which@4.0.0: