@fireproof/core 0.19.8-dev-global → 0.19.9-dev-frag

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. package/README.md +7 -0
  2. package/chunk-7EWIAXTM.js +7 -0
  3. package/chunk-7EWIAXTM.js.map +1 -0
  4. package/chunk-JO5AVWG7.js +67 -0
  5. package/chunk-JO5AVWG7.js.map +1 -0
  6. package/chunk-PB4BKL4O.js +7 -0
  7. package/chunk-PB4BKL4O.js.map +1 -0
  8. package/chunk-YS4GL6OK.js +266 -0
  9. package/chunk-YS4GL6OK.js.map +1 -0
  10. package/{store-indexdb-WLRSICCB.js → gateway-IZRHJWPE.js} +48 -80
  11. package/gateway-IZRHJWPE.js.map +1 -0
  12. package/gateway-YSNUK2L3.js +145 -0
  13. package/gateway-YSNUK2L3.js.map +1 -0
  14. package/index.cjs +2132 -1783
  15. package/index.cjs.map +1 -1
  16. package/index.d.cts +613 -513
  17. package/index.d.ts +613 -513
  18. package/index.global.js +19366 -20107
  19. package/index.global.js.map +1 -1
  20. package/index.js +1512 -1022
  21. package/index.js.map +1 -1
  22. package/key-bag-file-NMEBFSPM.js +54 -0
  23. package/key-bag-file-NMEBFSPM.js.map +1 -0
  24. package/key-bag-indexdb-X5V6GNBZ.js +50 -0
  25. package/key-bag-indexdb-X5V6GNBZ.js.map +1 -0
  26. package/mem-filesystem-B6C6QOIP.js +41 -0
  27. package/mem-filesystem-B6C6QOIP.js.map +1 -0
  28. package/metafile-cjs.json +1 -1
  29. package/metafile-esm.json +1 -1
  30. package/metafile-iife.json +1 -1
  31. package/node-filesystem-5JLBSHKQ.js +41 -0
  32. package/node-filesystem-5JLBSHKQ.js.map +1 -0
  33. package/package.json +8 -7
  34. package/tests/blockstore/fragment-gateway.test.ts +107 -0
  35. package/tests/blockstore/keyed-crypto.test.ts +302 -0
  36. package/tests/blockstore/loader.test.ts +24 -19
  37. package/tests/blockstore/store.test.ts +34 -28
  38. package/tests/blockstore/transaction.test.ts +19 -15
  39. package/tests/fireproof/config.test.ts +94 -78
  40. package/tests/fireproof/crdt.test.ts +34 -28
  41. package/tests/fireproof/database.test.ts +22 -14
  42. package/tests/fireproof/fireproof.test.fixture.ts +133 -0
  43. package/tests/fireproof/fireproof.test.ts +331 -219
  44. package/tests/fireproof/hello.test.ts +6 -4
  45. package/tests/fireproof/indexer.test.ts +34 -27
  46. package/tests/fireproof/utils.test.ts +65 -0
  47. package/tests/helpers.ts +25 -57
  48. package/utils-IZPK4QS7.js +14 -0
  49. package/utils-IZPK4QS7.js.map +1 -0
  50. package/chunk-BNL4PVBF.js +0 -314
  51. package/chunk-BNL4PVBF.js.map +0 -1
  52. package/chunk-JW2QT6BF.js +0 -184
  53. package/chunk-JW2QT6BF.js.map +0 -1
  54. package/node-sys-container-MIEX6ELJ.js +0 -29
  55. package/node-sys-container-MIEX6ELJ.js.map +0 -1
  56. package/store-file-VJ6BI4II.js +0 -191
  57. package/store-file-VJ6BI4II.js.map +0 -1
  58. package/store-indexdb-WLRSICCB.js.map +0 -1
package/chunk-BNL4PVBF.js DELETED
@@ -1,314 +0,0 @@
1
- import {
2
- SysContainer,
3
- __export,
4
- join
5
- } from "./chunk-JW2QT6BF.js";
6
-
7
- // src/utils.ts
8
- import { LoggerImpl, IsLogger, Result, ResolveOnce } from "@adviser/cement";
9
-
10
- // src/runtime/index.ts
11
- var runtime_exports = {};
12
- __export(runtime_exports, {
13
- FILESTORE_VERSION: () => FILESTORE_VERSION,
14
- INDEXDB_VERSION: () => INDEXDB_VERSION,
15
- SysContainer: () => SysContainer,
16
- crypto: () => crypto_exports,
17
- dataDir: () => dataDir,
18
- ensureIndexName: () => ensureIndexName,
19
- files: () => files_exports,
20
- getFileName: () => getFileName,
21
- getPath: () => getPath,
22
- join: () => join
23
- });
24
-
25
- // src/runtime/data-dir.ts
26
- function dataDir(name, base) {
27
- if (!base) {
28
- if (SysContainer.runtime().isNodeIsh || SysContainer.runtime().isDeno) {
29
- base = SysContainer.env.get("FP_STORAGE_URL") || `file://${SysContainer.join(SysContainer.homedir(), ".fireproof")}`;
30
- } else {
31
- base = `indexdb://fp`;
32
- }
33
- }
34
- let url;
35
- if (typeof base === "string") {
36
- try {
37
- url = new URL(base.toString());
38
- } catch (e) {
39
- try {
40
- base = `file://${base}`;
41
- url = new URL(base);
42
- } catch (e2) {
43
- throw new Error(`invalid base url: ${base}`);
44
- }
45
- }
46
- } else {
47
- url = base;
48
- }
49
- url.searchParams.set("name", name || "");
50
- return url.toString();
51
- }
52
-
53
- // src/runtime/crypto.ts
54
- var crypto_exports = {};
55
- __export(crypto_exports, {
56
- toCryptoOpts: () => toCryptoOpts
57
- });
58
- function randomBytes(size) {
59
- const bytes = new Uint8Array(size);
60
- if (size > 0) {
61
- crypto.getRandomValues(bytes);
62
- }
63
- return bytes;
64
- }
65
- function digestSHA256(data) {
66
- return Promise.resolve(crypto.subtle.digest("SHA-256", data));
67
- }
68
- function toCryptoOpts(cryptoOpts = {}) {
69
- const opts = {
70
- importKey: cryptoOpts.importKey || crypto.subtle.importKey.bind(crypto.subtle),
71
- encrypt: cryptoOpts.encrypt || crypto.subtle.encrypt.bind(crypto.subtle),
72
- decrypt: cryptoOpts.decrypt || crypto.subtle.decrypt.bind(crypto.subtle),
73
- randomBytes: cryptoOpts.randomBytes || randomBytes,
74
- digestSHA256: cryptoOpts.digestSHA256 || digestSHA256
75
- };
76
- return opts;
77
- }
78
-
79
- // src/runtime/files.ts
80
- var files_exports = {};
81
- __export(files_exports, {
82
- decodeFile: () => decodeFile,
83
- encodeFile: () => encodeFile
84
- });
85
- import * as UnixFS from "@ipld/unixfs";
86
- import * as raw from "multiformats/codecs/raw";
87
- import { withMaxChunkSize } from "@ipld/unixfs/file/chunker/fixed";
88
- import { withWidth } from "@ipld/unixfs/file/layout/balanced";
89
- import { exporter } from "ipfs-unixfs-exporter";
90
- var queuingStrategy = UnixFS.withCapacity();
91
- var settings = UnixFS.configure({
92
- fileChunkEncoder: raw,
93
- smallFileEncoder: raw,
94
- chunker: withMaxChunkSize(1024 * 1024),
95
- fileLayout: withWidth(1024)
96
- });
97
- async function collect(collectable) {
98
- const chunks = [];
99
- await collectable.pipeTo(
100
- new WritableStream({
101
- write(chunk) {
102
- chunks.push(chunk);
103
- }
104
- })
105
- );
106
- return chunks;
107
- }
108
- async function encodeFile(blob) {
109
- const readable = createFileEncoderStream(blob);
110
- const blocks = await collect(readable);
111
- return { cid: blocks.at(-1).cid, blocks };
112
- }
113
- async function decodeFile(blocks, cid, meta) {
114
- const entry = await exporter(cid.toString(), blocks, { length: meta.size });
115
- const chunks = [];
116
- for await (const chunk of entry.content()) {
117
- chunks.push(chunk);
118
- }
119
- return new File(chunks, entry.name, { type: meta.type, lastModified: 0 });
120
- }
121
- function createFileEncoderStream(blob) {
122
- const { readable, writable } = new TransformStream({}, queuingStrategy);
123
- const unixfsWriter = UnixFS.createWriter({ writable, settings });
124
- const fileBuilder = new UnixFSFileBuilder("", blob);
125
- void (async () => {
126
- await fileBuilder.finalize(unixfsWriter);
127
- await unixfsWriter.close();
128
- })();
129
- return readable;
130
- }
131
- var UnixFSFileBuilder = class {
132
- #file;
133
- constructor(name, file) {
134
- this.name = name;
135
- this.#file = file;
136
- }
137
- async finalize(writer) {
138
- const unixfsFileWriter = UnixFS.createFileWriter(writer);
139
- await this.#file.stream().pipeTo(
140
- new WritableStream({
141
- async write(chunk) {
142
- await unixfsFileWriter.write(chunk);
143
- }
144
- })
145
- );
146
- return await unixfsFileWriter.close();
147
- }
148
- };
149
-
150
- // src/runtime/store-file-version.ts
151
- var FILESTORE_VERSION = "v0.19-file";
152
-
153
- // src/runtime/store-indexdb-version.ts
154
- var INDEXDB_VERSION = "v0.19-indexdb";
155
-
156
- // src/utils.ts
157
- import { uuidv7 } from "uuidv7";
158
- var globalLogger = new LoggerImpl();
159
- var registerFP_DEBUG = new ResolveOnce();
160
- function ensureLogger(optsOrLogger, componentName, ctx) {
161
- let logger = globalLogger;
162
- if (IsLogger(optsOrLogger)) {
163
- logger = optsOrLogger;
164
- } else if (optsOrLogger && IsLogger(optsOrLogger.logger)) {
165
- logger = optsOrLogger.logger;
166
- }
167
- const cLogger = logger.With().Module(componentName);
168
- const debug = [];
169
- if (ctx) {
170
- if ("debug" in ctx) {
171
- if (typeof ctx.debug === "string" && ctx.debug.length > 0) {
172
- debug.push(ctx.debug);
173
- } else {
174
- debug.push(componentName);
175
- }
176
- delete ctx.debug;
177
- }
178
- if ("this" in ctx) {
179
- cLogger.Str("this", uuidv7());
180
- delete ctx.this;
181
- }
182
- for (const [key, value] of Object.entries(ctx)) {
183
- switch (typeof value) {
184
- case "string":
185
- cLogger.Str(key, value);
186
- break;
187
- case "number":
188
- cLogger.Uint64(key, value);
189
- break;
190
- default:
191
- if (value instanceof Date) {
192
- cLogger.Str(key, value.toISOString());
193
- } else if (value instanceof URL) {
194
- cLogger.Str(key, value.toString());
195
- } else if (typeof value === "function") {
196
- cLogger.Ref(key, value);
197
- } else {
198
- cLogger.Any(key, value);
199
- }
200
- break;
201
- }
202
- }
203
- }
204
- registerFP_DEBUG.once(async () => {
205
- SysContainer.env.onSet((key, value) => {
206
- if (value) {
207
- logger.SetDebug(value);
208
- }
209
- }, "FP_DEBUG");
210
- }).finally(() => {
211
- });
212
- if (debug.length > 0) {
213
- logger.SetDebug(debug);
214
- }
215
- const out = cLogger.Logger();
216
- return out;
217
- }
218
- function getStore(url, logger, joiner) {
219
- let result = url.searchParams.get("store");
220
- if (!result) throw logger.Error().Str("url", url.toString()).Msg(`store not found`).AsError();
221
- if (url.searchParams.has("index")) {
222
- result = joiner(url.searchParams.get("index") || "idx", result);
223
- }
224
- return result;
225
- }
226
- function getKey(url, logger) {
227
- const result = url.searchParams.get("key");
228
- if (!result) throw logger.Error().Str("url", url.toString()).Msg(`key not found`).AsError();
229
- return result;
230
- }
231
- function getName(url, logger) {
232
- let result = url.searchParams.get("name");
233
- if (!result) {
234
- result = SysContainer.dirname(url.pathname);
235
- if (result.length === 0) {
236
- throw logger.Error().Str("url", url.toString()).Msg(`name not found`).AsError();
237
- }
238
- }
239
- return result;
240
- }
241
- function exception2Result(fn) {
242
- return fn().then((value) => Result.Ok(value)).catch((e) => Result.Err(e));
243
- }
244
- async function exceptionWrapper(fn) {
245
- return fn().catch((e) => Result.Err(e));
246
- }
247
-
248
- // src/runtime/store-file-utils.ts
249
- async function getPath(url, logger) {
250
- const basePath = url.toString().replace(new RegExp(`^${url.protocol}//`), "").replace(/\?.*$/, "");
251
- const name = url.searchParams.get("name");
252
- if (name) {
253
- const version = url.searchParams.get("version");
254
- if (!version) throw logger.Error().Str("url", url.toString()).Msg(`version not found`).AsError();
255
- return SysContainer.join(basePath, version, name);
256
- }
257
- return SysContainer.join(basePath);
258
- }
259
- function getFileName(url, key, logger) {
260
- switch (getStore(url, logger, (...a) => a.join("/"))) {
261
- case "data":
262
- return key + ".car";
263
- case "meta":
264
- return key + ".json";
265
- default:
266
- throw logger.Error().Str("url", url.toString()).Msg(`unsupported store type`).AsError();
267
- }
268
- }
269
- function ensureIndexName(url, name) {
270
- if (url.searchParams.has("index")) {
271
- name = (url.searchParams.get("index")?.replace(/[^a-zA-Z0-9]/g, "") || "idx") + "-" + name;
272
- }
273
- return name;
274
- }
275
-
276
- // src/blockstore/gateway.ts
277
- import { Result as Result2 } from "@adviser/cement";
278
- var NotFoundError = class extends Error {
279
- constructor() {
280
- super(...arguments);
281
- this.code = "ENOENT";
282
- }
283
- };
284
- function isNotFoundError(e) {
285
- if (Result2.Is(e)) {
286
- if (e.isOk()) return false;
287
- e = e.Err();
288
- }
289
- if (e.code === "ENOENT") return true;
290
- return false;
291
- }
292
-
293
- export {
294
- dataDir,
295
- getPath,
296
- getFileName,
297
- ensureIndexName,
298
- toCryptoOpts,
299
- encodeFile,
300
- decodeFile,
301
- FILESTORE_VERSION,
302
- INDEXDB_VERSION,
303
- runtime_exports,
304
- Result,
305
- ensureLogger,
306
- getStore,
307
- getKey,
308
- getName,
309
- exception2Result,
310
- exceptionWrapper,
311
- NotFoundError,
312
- isNotFoundError
313
- };
314
- //# sourceMappingURL=chunk-BNL4PVBF.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils.ts","../../src/runtime/index.ts","../../src/runtime/data-dir.ts","../../src/runtime/crypto.ts","../../src/runtime/files.ts","../../src/runtime/store-file-version.ts","../../src/runtime/store-indexdb-version.ts","../../src/runtime/store-file-utils.ts","../../src/blockstore/gateway.ts"],"sourcesContent":["import { Logger, LoggerImpl, IsLogger, Result, ResolveOnce } from \"@adviser/cement\";\nimport { SysContainer } from \"./runtime\";\nimport { uuidv7 } from \"uuidv7\";\n\nexport type { Logger };\nexport { Result };\n\nconst globalLogger: Logger = new LoggerImpl();\n\nexport interface LoggerOpts {\n readonly logger?: Logger;\n}\n\nconst registerFP_DEBUG = new ResolveOnce();\n\nexport function ensureLogger(\n optsOrLogger: Partial<LoggerOpts> | Logger,\n componentName: string,\n ctx?: Record<string, unknown>,\n): Logger {\n // if (!opts?.logger) {\n // throw new Error(\"logger is required\");\n // }\n let logger = globalLogger;\n if (IsLogger(optsOrLogger)) {\n logger = optsOrLogger;\n } else if (optsOrLogger && IsLogger(optsOrLogger.logger)) {\n logger = optsOrLogger.logger;\n }\n const cLogger = logger.With().Module(componentName); //.Str(\"this\", uuidv7());\n const debug: string[] = [];\n if (ctx) {\n if (\"debug\" in ctx) {\n if (typeof ctx.debug === \"string\" && ctx.debug.length > 0) {\n debug.push(ctx.debug);\n } else {\n debug.push(componentName);\n }\n delete ctx.debug;\n }\n if (\"this\" in ctx) {\n cLogger.Str(\"this\", uuidv7());\n delete ctx.this;\n }\n for (const [key, value] of Object.entries(ctx)) {\n switch (typeof value) {\n case \"string\":\n cLogger.Str(key, value);\n break;\n case \"number\":\n cLogger.Uint64(key, value);\n break;\n default:\n if (value instanceof Date) {\n cLogger.Str(key, value.toISOString());\n } else if (value instanceof URL) {\n cLogger.Str(key, value.toString());\n } else if (typeof value === \"function\") {\n cLogger.Ref(key, value);\n } else {\n cLogger.Any(key, value);\n }\n break;\n }\n }\n }\n registerFP_DEBUG\n .once(async () => {\n // console.log(\"registerFP_DEBUG\", SysContainer.env)\n SysContainer.env.onSet((key, value) => {\n // console.log(\"FP_DEBUG\", key, value, debug)\n if (value) {\n logger.SetDebug(value);\n }\n }, \"FP_DEBUG\");\n })\n .finally(() => {\n /* do nothing */\n });\n\n if (debug.length > 0) {\n logger.SetDebug(debug);\n }\n const out = cLogger.Logger();\n // out.Debug().Msg(\"logger ready\");\n return out;\n}\n\nexport type Joiner = (...toJoin: string[]) => string;\n\nexport function getStore(url: URL, logger: Logger, joiner: Joiner): string {\n let result = url.searchParams.get(\"store\");\n if (!result) throw logger.Error().Str(\"url\", url.toString()).Msg(`store not found`).AsError();\n if (url.searchParams.has(\"index\")) {\n result = joiner(url.searchParams.get(\"index\") || \"idx\", result);\n }\n return result;\n}\n\nexport function getKey(url: URL, logger: Logger): string {\n const result = url.searchParams.get(\"key\");\n if (!result) throw logger.Error().Str(\"url\", url.toString()).Msg(`key not found`).AsError();\n return result;\n}\n\nexport function getName(url: URL, logger: Logger): string {\n let result = url.searchParams.get(\"name\");\n if (!result) {\n result = SysContainer.dirname(url.pathname);\n if (result.length === 0) {\n throw logger.Error().Str(\"url\", url.toString()).Msg(`name not found`).AsError();\n }\n }\n return result;\n}\n\nexport function exception2Result<T = void>(fn: () => Promise<T>): Promise<Result<T>> {\n return fn()\n .then((value) => Result.Ok(value))\n .catch((e) => Result.Err(e));\n}\n\nexport async function exceptionWrapper<T, E extends Error>(fn: () => Promise<Result<T, E>>): Promise<Result<T, E>> {\n return fn().catch((e) => Result.Err(e));\n}\n","export * from \"./sys-container.js\";\nexport * from \"./data-dir.js\";\nexport * from \"./store-file-utils.js\";\n\n// export * as sql from \"./store-sql/index.js\";\nexport * as crypto from \"./crypto.js\";\nexport * as files from \"./files.js\";\n\nexport { FILESTORE_VERSION } from \"./store-file-version.js\";\nexport { INDEXDB_VERSION } from \"./store-indexdb-version.js\";\n// export { V0_19SQL_VERSION } from \"./store-sql/v0.19/version.js\";\n","import { SysContainer } from \"./sys-container.js\";\n\nexport function dataDir(name?: string, base?: string | URL): string {\n if (!base) {\n if (SysContainer.runtime().isNodeIsh || SysContainer.runtime().isDeno) {\n base = SysContainer.env.get(\"FP_STORAGE_URL\") || `file://${SysContainer.join(SysContainer.homedir(), \".fireproof\")}`;\n } else {\n base = `indexdb://fp`;\n }\n }\n let url: URL;\n if (typeof base === \"string\") {\n try {\n url = new URL(base.toString());\n } catch (e) {\n try {\n base = `file://${base}`;\n url = new URL(base);\n } catch (e) {\n throw new Error(`invalid base url: ${base}`);\n }\n }\n } else {\n url = base;\n }\n url.searchParams.set(\"name\", name || \"\");\n return url.toString();\n}\n","import { CryptoOpts } from \"../blockstore/index.js\";\n\nfunction randomBytes(size: number) {\n const bytes = new Uint8Array(size);\n if (size > 0) {\n crypto.getRandomValues(bytes);\n }\n return bytes;\n}\n\nfunction digestSHA256(data: Uint8Array): Promise<ArrayBuffer> {\n return Promise.resolve(crypto.subtle.digest(\"SHA-256\", data));\n}\n\nexport function toCryptoOpts(cryptoOpts: Partial<CryptoOpts> = {}): CryptoOpts {\n const opts = {\n importKey: cryptoOpts.importKey || crypto.subtle.importKey.bind(crypto.subtle),\n encrypt: cryptoOpts.encrypt || crypto.subtle.encrypt.bind(crypto.subtle),\n decrypt: cryptoOpts.decrypt || crypto.subtle.decrypt.bind(crypto.subtle),\n randomBytes: cryptoOpts.randomBytes || randomBytes,\n digestSHA256: cryptoOpts.digestSHA256 || digestSHA256,\n };\n // console.log(\"cryptoOpts\", cryptoOpts, opts)\n return opts;\n}\n","import * as UnixFS from \"@ipld/unixfs\";\nimport * as raw from \"multiformats/codecs/raw\";\nimport { withMaxChunkSize } from \"@ipld/unixfs/file/chunker/fixed\";\nimport { withWidth } from \"@ipld/unixfs/file/layout/balanced\";\n\nimport type { View } from \"@ipld/unixfs\";\nimport { DocFileMeta } from \"../types.js\";\n\nimport { exporter, ReadableStorage } from \"ipfs-unixfs-exporter\";\nimport { BlobLike, AnyLink, AnyBlock } from \"../blockstore/index.js\";\n\nconst queuingStrategy = UnixFS.withCapacity();\n\nconst settings = UnixFS.configure({\n fileChunkEncoder: raw,\n smallFileEncoder: raw,\n chunker: withMaxChunkSize(1024 * 1024),\n fileLayout: withWidth(1024),\n});\n\nasync function collect<T>(collectable: ReadableStream<T>): Promise<T[]> {\n const chunks: T[] = [];\n await collectable.pipeTo(\n new WritableStream({\n write(chunk) {\n chunks.push(chunk);\n },\n }),\n );\n return chunks;\n}\n\nexport async function encodeFile(blob: BlobLike): Promise<{ cid: AnyLink; blocks: AnyBlock[] }> {\n const readable = createFileEncoderStream(blob);\n const blocks = await collect(readable);\n return { cid: blocks.at(-1).cid, blocks };\n}\n\nexport async function decodeFile(blocks: unknown, cid: AnyLink, meta: DocFileMeta): Promise<File> {\n const entry = await exporter(cid.toString(), blocks as ReadableStorage, { length: meta.size });\n const chunks = [];\n for await (const chunk of entry.content()) {\n chunks.push(chunk);\n }\n return new File(chunks, entry.name, { type: meta.type, lastModified: 0 });\n}\n\nfunction createFileEncoderStream(blob: BlobLike) {\n const { readable, writable } = new TransformStream({}, queuingStrategy);\n const unixfsWriter = UnixFS.createWriter({ writable, settings });\n const fileBuilder = new UnixFSFileBuilder(\"\", blob);\n void (async () => {\n await fileBuilder.finalize(unixfsWriter);\n await unixfsWriter.close();\n })();\n return readable;\n}\n\nclass UnixFSFileBuilder {\n #file;\n readonly name: string;\n constructor(name: string, file: BlobLike) {\n this.name = name;\n this.#file = file;\n }\n\n async finalize(writer: View) {\n const unixfsFileWriter = UnixFS.createFileWriter(writer);\n await this.#file.stream().pipeTo(\n new WritableStream({\n async write(chunk) {\n await unixfsFileWriter.write(chunk as Uint8Array);\n },\n }),\n );\n return await unixfsFileWriter.close();\n }\n}\n","export const FILESTORE_VERSION = \"v0.19-file\";\n","export const INDEXDB_VERSION = \"v0.19-indexdb\";\n","import { Logger, getStore } from \"../utils.js\";\nimport { SysContainer } from \"./sys-container.js\";\n\nexport async function getPath(url: URL, logger: Logger): Promise<string> {\n const basePath = url\n .toString()\n .replace(new RegExp(`^${url.protocol}//`), \"\")\n .replace(/\\?.*$/, \"\");\n const name = url.searchParams.get(\"name\");\n if (name) {\n const version = url.searchParams.get(\"version\");\n if (!version) throw logger.Error().Str(\"url\", url.toString()).Msg(`version not found`).AsError();\n return SysContainer.join(basePath, version, name);\n }\n return SysContainer.join(basePath);\n}\n\nexport function getFileName(url: URL, key: string, logger: Logger): string {\n switch (getStore(url, logger, (...a: string[]) => a.join(\"/\"))) {\n case \"data\":\n return key + \".car\";\n case \"meta\":\n return key + \".json\";\n default:\n throw logger.Error().Str(\"url\", url.toString()).Msg(`unsupported store type`).AsError();\n }\n}\n\nexport function ensureIndexName(url: URL, name: string): string {\n if (url.searchParams.has(\"index\")) {\n name = (url.searchParams.get(\"index\")?.replace(/[^a-zA-Z0-9]/g, \"\") || \"idx\") + \"-\" + name;\n }\n return name;\n}\n","import { Result } from \"@adviser/cement\";\n\nexport interface GatewayOpts {\n readonly gateway: Gateway;\n}\n\nexport class NotFoundError extends Error {\n readonly code = \"ENOENT\";\n}\n\nexport function isNotFoundError(e: Error | Result<unknown> | unknown): e is NotFoundError {\n if (Result.Is(e)) {\n if (e.isOk()) return false;\n e = e.Err();\n }\n if ((e as NotFoundError).code === \"ENOENT\") return true;\n return false;\n}\n\nexport type GetResult = Result<Uint8Array, NotFoundError | Error>;\nexport type VoidResult = Result<void>;\n\nexport interface Gateway {\n // all the methods never throw!\n // an error is reported as a Result\n buildUrl(baseUrl: URL, key: string): Promise<Result<URL>>;\n // start updates URL --> hate this side effect\n start(baseUrl: URL): Promise<VoidResult>;\n close(baseUrl: URL): Promise<VoidResult>;\n destroy(baseUrl: URL): Promise<VoidResult>;\n put(url: URL, body: Uint8Array): Promise<VoidResult>;\n // get could return a NotFoundError if the key is not found\n get(url: URL): Promise<GetResult>;\n delete(url: URL): Promise<VoidResult>;\n}\n"],"mappings":"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","names":["e","Result"]}
package/chunk-JW2QT6BF.js DELETED
@@ -1,184 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __export = (target, all) => {
3
- for (var name in all)
4
- __defProp(target, name, { get: all[name], enumerable: true });
5
- };
6
-
7
- // src/types.ts
8
- function isFalsy(value) {
9
- return value === false && value === null && value === void 0;
10
- }
11
- function throwFalsy(value) {
12
- if (isFalsy(value)) {
13
- throw new Error("value is Falsy");
14
- }
15
- return value;
16
- }
17
- function falsyToUndef(value) {
18
- if (isFalsy(value)) {
19
- return void 0;
20
- }
21
- return value;
22
- }
23
-
24
- // src/runtime/sys-container.ts
25
- import { uuidv4 } from "uuidv7";
26
- import { ResolveOnce, EnvImpl } from "@adviser/cement";
27
- function isSet(value, ref = globalThis) {
28
- const [head, ...tail] = value.split(".");
29
- if (["object", "function"].includes(typeof ref) && ref && ["object", "function"].includes(typeof ref[head]) && ref[head]) {
30
- if (tail.length <= 1) {
31
- return true;
32
- }
33
- return isSet(tail.join("."), ref[head]);
34
- }
35
- return false;
36
- }
37
- function runtimeFn() {
38
- const isNodeIsh = isSet("process.versions.node");
39
- const isDeno = isSet("Deno");
40
- return {
41
- isNodeIsh,
42
- isBrowser: !(isNodeIsh || isDeno),
43
- isDeno,
44
- isReactNative: false
45
- };
46
- }
47
- var onceStart = new ResolveOnce();
48
- function join(...paths) {
49
- return paths.map((i) => i.replace(/\/+$/, "")).join("/");
50
- }
51
- var envImpl = new EnvImpl({
52
- symbol: "FP_ENV",
53
- presetEnv: /* @__PURE__ */ new Map([
54
- // ["FP_DEBUG", "xxx"],
55
- // ["FP_ENV", "development"],
56
- ])
57
- });
58
- var sysContainer = class {
59
- constructor() {
60
- this.freight = {
61
- state: "seeded",
62
- join,
63
- dirname: (path) => path.split("/").slice(0, -1).join("/"),
64
- homedir: () => {
65
- throw new Error("SysContainer:homedir is not available in seeded state");
66
- },
67
- fileURLToPath: (strurl) => {
68
- let url;
69
- if (typeof strurl === "string") {
70
- url = new URL(strurl);
71
- } else {
72
- url = strurl;
73
- }
74
- return url.pathname;
75
- },
76
- // assert: (condition: unknown, message?: string | Error) => {
77
- // if (!condition) {
78
- // if (message instanceof Error) {
79
- // throw message;
80
- // } else {
81
- // throw new Error(message);
82
- // }
83
- // }
84
- // },
85
- mkdir: () => Promise.reject(new Error("SysContainer:mkdir is not available in seeded state")),
86
- readdir: () => Promise.reject(new Error("SysContainer:readdir is not available in seeded state")),
87
- rm: () => Promise.reject(new Error("SysContainer:rm is not available in seeded state")),
88
- copyFile: () => Promise.reject(new Error("SysContainer:copyFile is not available in seeded state")),
89
- readfile: () => Promise.reject(new Error("SysContainer:readfile is not available in seeded state")),
90
- unlink: () => Promise.reject(new Error("SysContainer:unlink is not available in seeded state")),
91
- writefile: () => Promise.reject(new Error("SysContainer:writefile is not available in seeded state")),
92
- stat: () => Promise.reject(new Error("SysContainer:stat is not available in seeded state"))
93
- };
94
- this.id = uuidv4();
95
- this.homedir = () => {
96
- this.logSeeded("homedir");
97
- return throwFalsy(this.freight).homedir();
98
- };
99
- this.runtime = runtimeFn;
100
- this.env = envImpl;
101
- }
102
- async start() {
103
- await onceStart.once(async () => {
104
- switch (this.freight.state) {
105
- case "seeded":
106
- if (this.runtime().isNodeIsh) {
107
- const { createNodeSysContainer } = await import("./node-sys-container-MIEX6ELJ.js");
108
- this.freight = await createNodeSysContainer();
109
- } else {
110
- this.freight.state = "browser";
111
- }
112
- return;
113
- case "browser":
114
- case "node":
115
- return;
116
- }
117
- });
118
- }
119
- async readdir(path, options) {
120
- this.logSeeded("readdir");
121
- return throwFalsy(this.freight).readdir(path, options) || [];
122
- }
123
- async readdirent(path, options) {
124
- this.logSeeded("readdirent");
125
- return throwFalsy(this.freight).readdir(path, { ...options, withFileTypes: true }) || [];
126
- }
127
- async readfile(path, options) {
128
- this.logSeeded("readfile");
129
- return throwFalsy(this.freight).readfile(path, options);
130
- }
131
- async mkdir(path, options) {
132
- this.logSeeded("mkdir");
133
- return throwFalsy(this.freight).mkdir(path, options);
134
- }
135
- async rm(path, options) {
136
- this.logSeeded("rm");
137
- return throwFalsy(this.freight).rm(path, options);
138
- }
139
- async unlink(path) {
140
- this.logSeeded("unlink");
141
- return throwFalsy(this.freight).unlink(path);
142
- }
143
- async writefile(path, data) {
144
- this.logSeeded("writefile");
145
- return throwFalsy(this.freight).writefile(path, data);
146
- }
147
- async copyFile(source, destination) {
148
- this.logSeeded("copyFile");
149
- return throwFalsy(this.freight).copyFile(source, destination);
150
- }
151
- async stat(path) {
152
- this.logSeeded("stat");
153
- return throwFalsy(this.freight).stat(path);
154
- }
155
- fileURLToPath(url) {
156
- this.logSeeded("fileURLToPath");
157
- return throwFalsy(this.freight).fileURLToPath(url);
158
- }
159
- dirname(path) {
160
- this.logSeeded("dirname");
161
- return throwFalsy(this.freight).dirname(path);
162
- }
163
- join(...args) {
164
- this.logSeeded("join");
165
- return throwFalsy(this.freight).join(...args);
166
- }
167
- logSeeded(method) {
168
- if (this.freight.state === "seeded") {
169
- const err = new Error();
170
- console.warn(`SysContainer.${method} is not available in seeded state:`, err.stack);
171
- }
172
- }
173
- };
174
- var SysContainer = new sysContainer();
175
-
176
- export {
177
- __export,
178
- isFalsy,
179
- throwFalsy,
180
- falsyToUndef,
181
- join,
182
- SysContainer
183
- };
184
- //# sourceMappingURL=chunk-JW2QT6BF.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/types.ts","../../src/runtime/sys-container.ts"],"sourcesContent":["import type { EventLink } from \"@web3-storage/pail/clock/api\";\nimport type { Operation } from \"@web3-storage/pail/crdt/api\";\n\nimport type { DbMeta, CryptoOpts, StoreOpts, AnyLink } from \"./blockstore/index.js\";\nimport { Logger } from \"@adviser/cement\";\n\nexport type Falsy = false | null | undefined;\n\nexport function isFalsy(value: unknown): value is Falsy {\n return value === false && value === null && value === undefined;\n}\n\nexport function throwFalsy<T>(value: T | Falsy): T {\n if (isFalsy(value)) {\n throw new Error(\"value is Falsy\");\n }\n return value;\n}\n\nexport function falsyToUndef<T>(value: T | Falsy): T | undefined {\n if (isFalsy(value)) {\n return undefined;\n }\n return value;\n}\n\nexport interface ConfigOpts {\n readonly public?: boolean;\n readonly meta?: DbMeta;\n readonly persistIndexes?: boolean;\n readonly autoCompact?: number;\n readonly crypto?: CryptoOpts;\n readonly store?: StoreOpts;\n // readonly indexStore?: StoreOpts;\n readonly threshold?: number;\n readonly logger?: Logger;\n}\n\nexport type ClockLink = EventLink<Operation>;\n\nexport type ClockHead = ClockLink[];\n\nexport type DocFragment = Uint8Array | string | number | boolean | null | AnyLink | DocFragment[] | object;\n// | { [key: string]: DocFragment };\n\nexport type DocLiteral = string | number | boolean | Uint8Array | unknown;\n\nexport type DocObject = NonNullable<unknown>;\nexport type DocTypes = DocObject;\n\nexport type DocRecord<T extends DocObject> = T;\n\nexport type UnknownDoc = DocRecord<never>;\n\nexport type DocFiles = Record<string, DocFileMeta | File>;\n\nexport interface DocBase {\n readonly _id: string;\n readonly _files?: DocFiles;\n readonly _publicFiles?: DocFiles;\n readonly _deleted?: boolean;\n}\n\nexport type DocWithId<T extends DocTypes> = DocBase & T;\n\nexport type DocSet<T extends DocTypes> = Partial<DocBase> & T;\n\nexport interface DocFileMeta {\n readonly type: string;\n readonly size: number;\n readonly cid: AnyLink;\n readonly car?: AnyLink;\n url?: string;\n file?: () => Promise<File>;\n}\n\nexport interface DocUpdate<T extends DocTypes> {\n readonly id: string;\n readonly value?: DocSet<T>;\n readonly del?: boolean;\n readonly clock?: ClockLink; // would be useful to give ClockLinks a type\n}\n\n// todo merge into above\nexport interface DocValue<T extends DocTypes> {\n readonly doc: DocWithId<T>;\n readonly del: boolean;\n readonly cid: AnyLink;\n}\n\nexport type KeyLiteral = string | number | boolean;\nexport type IndexKeyType = KeyLiteral | KeyLiteral[];\nexport type IndexKey<K extends IndexKeyType> = [K, string];\n\nexport interface IndexUpdate<K extends IndexKeyType> {\n readonly key: IndexKey<K>;\n readonly value?: DocFragment;\n readonly del?: boolean;\n}\n\nexport interface IndexUpdateString {\n readonly key: string;\n readonly value?: DocFragment;\n readonly del?: boolean;\n}\n\n// export interface IndexRowObject<K extends IndexKeyType, T extends DocObject> {\n// readonly id: string;\n// readonly key: K;\n// readonly value: T\n// // readonly row: T // DocFragment;\n// // readonly doc?: DocWithId<T>;\n// // value?: T;\n// // readonly del?: boolean;\n// }\n\n// export interface IndexRowLiteral<K extends IndexKeyType, T extends DocLiteral> {\n// readonly id: string;\n// readonly key: IndexKey<K>;\n// readonly value: T\n// }\n\n// export type IndexRow<K extends IndexKeyType, T extends DocTypes> =\n// T extends DocLiteral ? IndexRowLiteral<K, T> : IndexRowObject<K, T>\n\nexport interface IndexRow<K extends IndexKeyType, T extends DocObject, R extends DocFragment> {\n readonly id: string;\n readonly key: K; // IndexKey<K>;\n readonly value: R;\n readonly doc?: DocWithId<T>;\n}\n\nexport interface IndexRows<K extends IndexKeyType, T extends DocObject, R extends DocFragment = T> {\n readonly rows: IndexRow<K, T, R>[];\n}\nexport interface CRDTMeta {\n readonly head: ClockHead;\n}\n\nexport interface IndexTransactionMeta {\n readonly indexes: Record<string, IdxMeta>;\n}\n\nexport interface FileTransactionMeta {\n readonly files?: AnyLink[];\n}\n\nexport type MetaType = CRDTMeta | IndexTransactionMeta | FileTransactionMeta;\n\nexport interface IdxMeta {\n readonly byId: AnyLink;\n readonly byKey: AnyLink;\n readonly map: string;\n readonly name: string;\n readonly head: ClockHead;\n}\n\nexport interface IdxMetaMap {\n readonly indexes?: Map<string, IdxMeta>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface QueryOpts<K extends IndexKeyType> {\n readonly descending?: boolean;\n readonly limit?: number;\n includeDocs?: boolean;\n readonly range?: [IndexKeyType, IndexKeyType];\n readonly key?: DocFragment;\n readonly keys?: DocFragment[];\n prefix?: IndexKeyType;\n}\n\nexport interface AllDocsQueryOpts extends QueryOpts<string> {\n readonly key?: string;\n readonly keys?: string[];\n prefix?: string;\n}\n\nexport interface AllDocsResponse<T extends DocTypes> {\n readonly rows: {\n readonly key: string;\n readonly value: DocWithId<T>;\n }[];\n readonly clock: ClockHead;\n readonly name?: string;\n}\n\ntype EmitFn = (k: IndexKeyType, v?: DocFragment) => void;\nexport type MapFn<T extends DocTypes> = (doc: DocWithId<T>, emit: EmitFn) => DocFragment | unknown;\n\nexport interface ChangesOptions {\n readonly dirty?: boolean;\n readonly limit?: number;\n}\n\nexport interface ChangesResponseRow<T extends DocTypes> {\n readonly key: string;\n readonly value: DocWithId<T>;\n readonly clock?: ClockLink;\n}\n\nexport interface ChangesResponse<T extends DocTypes> {\n readonly clock: ClockHead;\n readonly rows: ChangesResponseRow<T>[];\n readonly name?: string;\n}\n\nexport interface DocResponse {\n readonly id: string;\n readonly clock: ClockHead;\n readonly name?: string;\n}\n\nexport type UpdateListenerFn<T extends DocTypes> = (docs: DocWithId<T>[]) => Promise<void> | void;\nexport type NoUpdateListenerFn = () => Promise<void> | void;\nexport type ListenerFn<T extends DocTypes> = UpdateListenerFn<T> | NoUpdateListenerFn;\n","import type { Dirent, MakeDirectoryOptions, ObjectEncodingOptions, PathLike, Stats } from \"fs\";\n\nimport { uuidv4 } from \"uuidv7\";\nimport { ResolveOnce, EnvImpl } from \"@adviser/cement\";\n\nimport { throwFalsy } from \"../types.js\";\n\nexport interface Runtime {\n isNodeIsh: boolean;\n isBrowser: boolean;\n isDeno: boolean;\n isReactNative: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction isSet(value: string, ref: any = globalThis): boolean {\n const [head, ...tail] = value.split(\".\");\n // console.log(`isSet: ${head} -> ${tail.join(\".\")} -> ${ref}`);\n if ([\"object\", \"function\"].includes(typeof ref) && ref && [\"object\", \"function\"].includes(typeof ref[head]) && ref[head]) {\n if (tail.length <= 1) {\n // console.log(`isSet: ${value} -> TRUE`);\n return true;\n }\n return isSet(tail.join(\".\"), ref[head]);\n }\n // console.log(`isSet: ${value} -> FALSE`);\n return false;\n}\n\nfunction runtimeFn(): Runtime {\n // console.log(`runtimeFn`);\n const isNodeIsh = isSet(\"process.versions.node\");\n const isDeno = isSet(\"Deno\");\n return {\n isNodeIsh,\n isBrowser: !(isNodeIsh || isDeno),\n isDeno,\n isReactNative: false,\n };\n}\nexport interface NodeMap {\n state: \"seeded\" | \"browser\" | \"node\";\n join: (...args: string[]) => string;\n dirname: (path: string) => string;\n homedir: () => string;\n fileURLToPath: (url: string | URL) => string;\n // assert: (condition: unknown, message?: string | Error) => void;\n\n mkdir: (path: PathLike, options?: { recursive: boolean }) => Promise<string | undefined>;\n readdir: (path: PathLike, options?: unknown) => Promise<unknown[]>;\n\n rm: (path: PathLike, options?: MakeDirectoryOptions & { recursive: boolean }) => Promise<void>;\n copyFile: (source: PathLike, destination: PathLike) => Promise<void>;\n\n readfile: (path: PathLike, options?: { encoding: BufferEncoding; flag?: string }) => Promise<string>;\n\n stat: (path: PathLike) => Promise<Stats>;\n\n unlink: (path: PathLike) => Promise<void>;\n writefile: (path: PathLike, data: Uint8Array | string) => Promise<void>;\n}\n\n// export function assert(condition: unknown, message?: string | Error): asserts condition {\n// SysContainer.freight?.assert(condition, message);\n// }\n\nconst onceStart = new ResolveOnce<void>();\n\nexport function join(...paths: string[]): string {\n return paths.map((i) => i.replace(/\\/+$/, \"\")).join(\"/\");\n}\n\nconst envImpl = new EnvImpl({\n symbol: \"FP_ENV\",\n presetEnv: new Map([\n // [\"FP_DEBUG\", \"xxx\"],\n // [\"FP_ENV\", \"development\"],\n ]),\n});\n// console.log(`EnvImpl`, envImpl);\n\nclass sysContainer {\n freight: NodeMap = {\n state: \"seeded\",\n join,\n dirname: (path: string) => path.split(\"/\").slice(0, -1).join(\"/\"),\n homedir: () => {\n throw new Error(\"SysContainer:homedir is not available in seeded state\");\n },\n fileURLToPath: (strurl: string | URL) => {\n let url: URL;\n if (typeof strurl === \"string\") {\n url = new URL(strurl);\n } else {\n url = strurl;\n }\n return url.pathname;\n },\n // assert: (condition: unknown, message?: string | Error) => {\n // if (!condition) {\n // if (message instanceof Error) {\n // throw message;\n // } else {\n // throw new Error(message);\n // }\n // }\n // },\n mkdir: () => Promise.reject(new Error(\"SysContainer:mkdir is not available in seeded state\")),\n readdir: () => Promise.reject(new Error(\"SysContainer:readdir is not available in seeded state\")),\n rm: () => Promise.reject(new Error(\"SysContainer:rm is not available in seeded state\")),\n copyFile: () => Promise.reject(new Error(\"SysContainer:copyFile is not available in seeded state\")),\n readfile: () => Promise.reject(new Error(\"SysContainer:readfile is not available in seeded state\")),\n unlink: () => Promise.reject(new Error(\"SysContainer:unlink is not available in seeded state\")),\n writefile: () => Promise.reject(new Error(\"SysContainer:writefile is not available in seeded state\")),\n stat: () => Promise.reject(new Error(\"SysContainer:stat is not available in seeded state\")),\n };\n\n readonly id = uuidv4();\n\n async start(): Promise<void> {\n await onceStart.once(async () => {\n switch (this.freight.state) {\n case \"seeded\":\n if (this.runtime().isNodeIsh) {\n const { createNodeSysContainer } = await import(\"./node-sys-container.js\");\n // console.log(\"use NodeSysContainer\");\n this.freight = await createNodeSysContainer();\n } else {\n // console.log(\"use BrowserSysContainer\");\n this.freight.state = \"browser\";\n }\n return;\n case \"browser\":\n case \"node\":\n return;\n }\n });\n }\n\n async readdir(\n path: PathLike,\n options?:\n | (ObjectEncodingOptions & { withFileTypes?: false | undefined; recursive?: boolean })\n | BufferEncoding\n | null\n | undefined,\n ) {\n this.logSeeded(\"readdir\");\n return (throwFalsy(this.freight).readdir(path, options) as Promise<string[]>) || [];\n }\n async readdirent(\n path: PathLike,\n options: (ObjectEncodingOptions & { withFileTypes: true; recursive?: boolean }) | BufferEncoding | null | undefined,\n ): Promise<Dirent[]> {\n this.logSeeded(\"readdirent\");\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (throwFalsy(this.freight).readdir(path, { ...(options as any), withFileTypes: true }) as Promise<Dirent[]>) || [];\n }\n\n async readfile(path: PathLike, options?: { encoding: BufferEncoding; flag?: string }) {\n this.logSeeded(\"readfile\");\n return throwFalsy(this.freight).readfile(path, options) as unknown as Promise<Buffer>;\n }\n\n async mkdir(path: PathLike, options: { recursive: boolean }) {\n this.logSeeded(\"mkdir\");\n return throwFalsy(this.freight).mkdir(path, options);\n }\n\n async rm(path: PathLike, options: MakeDirectoryOptions & { recursive: boolean }) {\n this.logSeeded(\"rm\");\n return throwFalsy(this.freight).rm(path, options);\n }\n\n async unlink(path: PathLike) {\n this.logSeeded(\"unlink\");\n return throwFalsy(this.freight).unlink(path);\n }\n\n async writefile(path: PathLike, data: Uint8Array | string) {\n this.logSeeded(\"writefile\");\n return throwFalsy(this.freight).writefile(path, data);\n }\n\n async copyFile(source: PathLike, destination: PathLike) {\n this.logSeeded(\"copyFile\");\n return throwFalsy(this.freight).copyFile(source, destination);\n }\n\n async stat(path: PathLike) {\n this.logSeeded(\"stat\");\n return throwFalsy(this.freight).stat(path);\n }\n\n fileURLToPath(url: string | URL) {\n this.logSeeded(\"fileURLToPath\");\n return throwFalsy(this.freight).fileURLToPath(url);\n }\n\n dirname(path: string) {\n this.logSeeded(\"dirname\");\n return throwFalsy(this.freight).dirname(path);\n }\n\n join(...args: string[]): string {\n this.logSeeded(\"join\");\n return throwFalsy(this.freight).join(...args);\n }\n\n homedir = () => {\n this.logSeeded(\"homedir\");\n return throwFalsy(this.freight).homedir();\n };\n\n logSeeded(method: string) {\n if (this.freight.state === \"seeded\") {\n const err = new Error();\n console.warn(`SysContainer.${method} is not available in seeded state:`, err.stack);\n }\n }\n\n readonly runtime = runtimeFn;\n readonly env = envImpl;\n}\n\n// // eslint-disable-next-line @typescript-eslint/no-explicit-any\n// export async function saveImport(fName: string): Promise<any> {\n// try {\n// const i = await import(fName);\n// return i;\n// } catch (e: unknown) {\n// console.error(`saveImport failed for ${fName} with`, e);\n// throw e;\n// }\n// }\n\nexport const SysContainer = new sysContainer();\n"],"mappings":"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","names":[]}
@@ -1,29 +0,0 @@
1
- import {
2
- join
3
- } from "./chunk-JW2QT6BF.js";
4
-
5
- // src/runtime/node-sys-container.ts
6
- import * as fs from "fs/promises";
7
- import * as path from "path";
8
- import * as os from "os";
9
- import * as url from "url";
10
- async function createNodeSysContainer() {
11
- return {
12
- state: "node",
13
- ...path,
14
- // ...(await import("node:os")),
15
- // ...(await import("node:url")),
16
- ...os,
17
- ...url,
18
- ...fs,
19
- join,
20
- stat: fs.stat,
21
- readdir: fs.readdir,
22
- readfile: fs.readFile,
23
- writefile: fs.writeFile
24
- };
25
- }
26
- export {
27
- createNodeSysContainer
28
- };
29
- //# sourceMappingURL=node-sys-container-MIEX6ELJ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/runtime/node-sys-container.ts"],"sourcesContent":["import { type NodeMap, join } from \"./sys-container.js\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport * as url from \"url\";\n\nexport async function createNodeSysContainer(): Promise<NodeMap> {\n // const nodePath = \"node:path\";\n // const nodeOS = \"node:os\";\n // const nodeURL = \"node:url\";\n // const nodeFS = \"node:fs\";\n // const fs = (await import(\"node:fs\")).promises;\n // const assert = \"assert\";\n // const path = await import(\"node:path\");\n return {\n state: \"node\",\n ...path,\n // ...(await import(\"node:os\")),\n // ...(await import(\"node:url\")),\n ...os,\n ...url,\n ...fs,\n join,\n stat: fs.stat as NodeMap[\"stat\"],\n readdir: fs.readdir as NodeMap[\"readdir\"],\n readfile: fs.readFile as NodeMap[\"readfile\"],\n writefile: fs.writeFile as NodeMap[\"writefile\"],\n };\n}\n"],"mappings":";;;;;AACA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ;AACpB,YAAY,SAAS;AAErB,eAAsB,yBAA2C;AAQ/D,SAAO;AAAA,IACL,OAAO;AAAA,IACP,GAAG;AAAA;AAAA;AAAA,IAGH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH;AAAA,IACA,MAAS;AAAA,IACT,SAAY;AAAA,IACZ,UAAa;AAAA,IACb,WAAc;AAAA,EAChB;AACF;","names":[]}