@adviser/cement 0.4.27 → 0.4.28

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.
Files changed (39) hide show
  1. package/cjs/load-asset.cjs +107 -0
  2. package/cjs/load-asset.cjs.map +1 -0
  3. package/cjs/load-asset.d.ts +14 -0
  4. package/cjs/load-asset.d.ts.map +1 -0
  5. package/cjs/load-asset.test.cjs +31 -0
  6. package/cjs/load-asset.test.cjs.map +1 -0
  7. package/cjs/load-asset.test.d.ts +2 -0
  8. package/cjs/load-asset.test.d.ts.map +1 -0
  9. package/cjs/version.cjs +1 -1
  10. package/deno.json +1 -1
  11. package/esm/load-asset.d.ts +14 -0
  12. package/esm/load-asset.d.ts.map +1 -0
  13. package/esm/load-asset.js +71 -0
  14. package/esm/load-asset.js.map +1 -0
  15. package/esm/load-asset.test.d.ts +2 -0
  16. package/esm/load-asset.test.d.ts.map +1 -0
  17. package/esm/load-asset.test.js +29 -0
  18. package/esm/load-asset.test.js.map +1 -0
  19. package/esm/version.js +1 -1
  20. package/package.json +1 -1
  21. package/src/load-asset.ts +101 -0
  22. package/ts/cjs/load-asset.d.ts +14 -0
  23. package/ts/cjs/load-asset.d.ts.map +1 -0
  24. package/ts/cjs/load-asset.js +107 -0
  25. package/ts/cjs/load-asset.js.map +1 -0
  26. package/ts/cjs/load-asset.test.d.ts +2 -0
  27. package/ts/cjs/load-asset.test.d.ts.map +1 -0
  28. package/ts/cjs/load-asset.test.js +31 -0
  29. package/ts/cjs/load-asset.test.js.map +1 -0
  30. package/ts/cjs/version.js +1 -1
  31. package/ts/esm/load-asset.d.ts +14 -0
  32. package/ts/esm/load-asset.d.ts.map +1 -0
  33. package/ts/esm/load-asset.js +71 -0
  34. package/ts/esm/load-asset.js.map +1 -0
  35. package/ts/esm/load-asset.test.d.ts +2 -0
  36. package/ts/esm/load-asset.test.d.ts.map +1 -0
  37. package/ts/esm/load-asset.test.js +29 -0
  38. package/ts/esm/load-asset.test.js.map +1 -0
  39. package/ts/esm/version.js +1 -1
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.loadAsset = loadAsset;
37
+ const path_ops_js_1 = require("./path-ops.cjs");
38
+ const result_js_1 = require("./result.cjs");
39
+ const runtime_js_1 = require("./runtime.cjs");
40
+ const uri_js_1 = require("./uri.cjs");
41
+ function callFetch(mock) {
42
+ return mock?.fetch ? mock.fetch : globalThis.fetch;
43
+ }
44
+ async function callFsReadFile(mock) {
45
+ if (mock?.fsReadFile) {
46
+ return mock.fsReadFile;
47
+ }
48
+ const fs = await Promise.resolve().then(() => __importStar(require("fs")));
49
+ return (fname) => fs.promises.readFile(fname);
50
+ }
51
+ function fallBackBaseUrl(opts) {
52
+ return { url: opts.fallBackUrl ? uri_js_1.URI.from(opts.fallBackUrl).asURL() : undefined, src: "opts.fallBackUrl" };
53
+ }
54
+ async function loadAsset(localPath, opts = {}) {
55
+ const base = import.meta?.url ? { url: new URL(path_ops_js_1.pathOps.dirname(import.meta.url)), src: "import.meta.url" } : fallBackBaseUrl(opts);
56
+ return loadAssetReal(base, localPath, opts);
57
+ }
58
+ async function loadAssetReal(baseUrl, localPath, opts) {
59
+ if (!baseUrl.url) {
60
+ return result_js_1.Result.Err(`base url not found from ${baseUrl.src}`);
61
+ }
62
+ const urlO = new URL(baseUrl.url.toString());
63
+ urlO.pathname = path_ops_js_1.pathOps.dirname(urlO.pathname);
64
+ if (baseUrl.url.protocol.startsWith("file")) {
65
+ const rt = (0, runtime_js_1.runtimeFn)();
66
+ const fname = opts.pathCleaner(baseUrl.url.pathname, localPath, "normal");
67
+ if (rt.isNodeIsh || rt.isDeno) {
68
+ try {
69
+ const out = await callFsReadFile(opts.mock).then((fn) => fn(fname));
70
+ const txt = new TextDecoder().decode(out);
71
+ return result_js_1.Result.Ok(txt);
72
+ }
73
+ catch (e) {
74
+ console.warn("fs direct access failed:", baseUrl.url.pathname, baseUrl.src, e);
75
+ }
76
+ }
77
+ if (baseUrl.src === "import.meta.url") {
78
+ return loadAssetReal(fallBackBaseUrl(opts), localPath, opts);
79
+ }
80
+ return result_js_1.Result.Err(`cannot load file: ${baseUrl.url.toString()} from ${baseUrl.src}`);
81
+ }
82
+ switch (baseUrl.src) {
83
+ case "opts.fallBackUrl":
84
+ baseUrl.url.pathname = opts.pathCleaner(baseUrl.url.pathname, localPath, "fallback");
85
+ break;
86
+ case "import.meta.url":
87
+ baseUrl.url.pathname = opts.pathCleaner(baseUrl.url.pathname, localPath, "normal");
88
+ break;
89
+ }
90
+ const rRes = await (0, result_js_1.exception2Result)(() => callFetch(opts.mock)(baseUrl.url));
91
+ if (rRes.isErr()) {
92
+ if (baseUrl.src === "import.meta.url") {
93
+ console.warn(`fetch failed for: ${baseUrl.url}`);
94
+ return loadAssetReal(fallBackBaseUrl(opts), localPath, opts);
95
+ }
96
+ return result_js_1.Result.Err(rRes);
97
+ }
98
+ if (!rRes.Ok().ok) {
99
+ if (baseUrl.src === "import.meta.url") {
100
+ console.warn(`fetch return !ok for: ${baseUrl.url}`);
101
+ return loadAssetReal(fallBackBaseUrl(opts), localPath, opts);
102
+ }
103
+ return result_js_1.Result.Err(`Fetch failed: ${baseUrl.url.toString()} ${rRes.Ok().status} ${rRes.Ok().statusText}`);
104
+ }
105
+ return result_js_1.Result.Ok(await rRes.Ok().text());
106
+ }
107
+ //# sourceMappingURL=load-asset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-asset.js","sourceRoot":"","sources":["../../../src/load-asset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Result } from "./result.js";
2
+ import { CoerceURI } from "./uri.js";
3
+ interface MockLoadAsset {
4
+ fetch: typeof globalThis.fetch;
5
+ fsReadFile: (fname: string) => Promise<Uint8Array>;
6
+ }
7
+ export interface LoadAssetOptions {
8
+ readonly fallBackUrl: CoerceURI;
9
+ readonly pathCleaner: (base: string, localPath: string, mode: "fallback" | "normal") => string;
10
+ readonly mock: Partial<MockLoadAsset>;
11
+ }
12
+ export declare function loadAsset(localPath: string, opts?: Partial<LoadAssetOptions>): Promise<Result<string>>;
13
+ export {};
14
+ //# sourceMappingURL=load-asset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-asset.d.ts","sourceRoot":"","sources":["../../../src/load-asset.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAoB,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAO,MAAM,UAAU,CAAC;AAE1C,UAAU,aAAa;IACrB,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC/B,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CACpD;AAcD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,QAAQ,KAAK,MAAM,CAAC;IAC/F,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CACvC;AAMD,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,OAAO,CAAC,gBAAgB,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAMhH"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const load_asset_js_1 = require("./load-asset.cjs");
5
+ const runtime_js_1 = require("./runtime.cjs");
6
+ (0, vitest_1.describe)("loadAsset", () => {
7
+ if (!(0, runtime_js_1.runtimeFn)().isCFWorker) {
8
+ (0, vitest_1.it)("returns file content using fetch", async () => {
9
+ const result = await (0, load_asset_js_1.loadAsset)("version.ts", {
10
+ fallBackUrl: "not://working/x",
11
+ pathCleaner: (base, localPath) => `${base}/./${localPath}`,
12
+ });
13
+ (0, vitest_1.expect)(result.isOk()).toBe(true);
14
+ (0, vitest_1.expect)(result.Ok()).toContain("VERSION");
15
+ });
16
+ (0, vitest_1.it)("returns file content from fallback", async () => {
17
+ const result = await (0, load_asset_js_1.loadAsset)("version.ts", {
18
+ fallBackUrl: (0, runtime_js_1.runtimeFn)().isBrowser ? import.meta.url : "file://./",
19
+ pathCleaner: (base, localPath) => `${base}/${localPath}`,
20
+ });
21
+ (0, vitest_1.expect)(result.isOk()).toBe(true);
22
+ (0, vitest_1.expect)(result.Ok()).toContain("VERSION");
23
+ });
24
+ }
25
+ else {
26
+ (0, vitest_1.it)("do nothing", () => {
27
+ assert(true);
28
+ });
29
+ }
30
+ });
31
+ //# sourceMappingURL=load-asset.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-asset.test.js","sourceRoot":"","sources":["../../../src/load-asset.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,mDAA4C;AAC5C,6CAAyC;AAEzC,IAAA,iBAAQ,EAAC,WAAW,EAAE,GAAG,EAAE,CAAC;IAC1B,IAAI,CAAC,IAAA,sBAAS,GAAE,CAAC,UAAU,EAAE,CAAC;QAC5B,IAAA,WAAE,EAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAS,EAAC,YAAY,EAAE;gBAC3C,WAAW,EAAE,iBAAiB;gBAC9B,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,GAAG,IAAI,MAAM,SAAS,EAAE;aAC3D,CAAC,CAAC;YACH,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,IAAA,eAAM,EAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAAA,CAC1C,CAAC,CAAC;QACH,IAAA,WAAE,EAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAS,EAAC,YAAY,EAAE;gBAC3C,WAAW,EAAE,IAAA,sBAAS,GAAE,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;gBAClE,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,SAAS,EAAE;aACzD,CAAC,CAAC;YACH,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,IAAA,eAAM,EAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAAA,CAC1C,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,IAAA,WAAE,EAAC,YAAY,EAAE,GAAG,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,CAAC;QAAA,CACd,CAAC,CAAC;IACL,CAAC;AAAA,CACF,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=load-asset.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-asset.test.d.ts","sourceRoot":"","sources":["../../../src/load-asset.test.ts"],"names":[],"mappings":""}
package/cjs/version.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
- exports.VERSION = "0.4.27";
4
+ exports.VERSION = "0.4.28";
5
5
  //# sourceMappingURL=version.js.map
package/deno.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adviser/cement",
3
- "version": "0.4.27",
3
+ "version": "0.4.28",
4
4
  "license": "AFL-2.0",
5
5
  "exports": {
6
6
  ".": "./src/index.ts",
@@ -0,0 +1,14 @@
1
+ import { Result } from "./result.js";
2
+ import { CoerceURI } from "./uri.js";
3
+ interface MockLoadAsset {
4
+ fetch: typeof globalThis.fetch;
5
+ fsReadFile: (fname: string) => Promise<Uint8Array>;
6
+ }
7
+ export interface LoadAssetOptions {
8
+ readonly fallBackUrl: CoerceURI;
9
+ readonly pathCleaner: (base: string, localPath: string, mode: "fallback" | "normal") => string;
10
+ readonly mock: Partial<MockLoadAsset>;
11
+ }
12
+ export declare function loadAsset(localPath: string, opts?: Partial<LoadAssetOptions>): Promise<Result<string>>;
13
+ export {};
14
+ //# sourceMappingURL=load-asset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-asset.d.ts","sourceRoot":"","sources":["../../../src/load-asset.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAoB,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAO,MAAM,UAAU,CAAC;AAE1C,UAAU,aAAa;IACrB,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC/B,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CACpD;AAcD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,QAAQ,KAAK,MAAM,CAAC;IAC/F,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CACvC;AAMD,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,OAAO,CAAC,gBAAgB,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAMhH"}
@@ -0,0 +1,71 @@
1
+ import { pathOps } from "./path-ops.js";
2
+ import { Result, exception2Result } from "./result.js";
3
+ import { runtimeFn } from "./runtime.js";
4
+ import { URI } from "./uri.js";
5
+ function callFetch(mock) {
6
+ return mock?.fetch ? mock.fetch : globalThis.fetch;
7
+ }
8
+ async function callFsReadFile(mock) {
9
+ if (mock?.fsReadFile) {
10
+ return mock.fsReadFile;
11
+ }
12
+ const fs = await import("fs");
13
+ return (fname) => fs.promises.readFile(fname);
14
+ }
15
+ function fallBackBaseUrl(opts) {
16
+ return { url: opts.fallBackUrl ? URI.from(opts.fallBackUrl).asURL() : undefined, src: "opts.fallBackUrl" };
17
+ }
18
+ export async function loadAsset(localPath, opts = {}) {
19
+ const base = import.meta?.url ? { url: new URL(pathOps.dirname(import.meta.url)), src: "import.meta.url" } : fallBackBaseUrl(opts);
20
+ return loadAssetReal(base, localPath, opts);
21
+ }
22
+ async function loadAssetReal(baseUrl, localPath, opts) {
23
+ if (!baseUrl.url) {
24
+ return Result.Err(`base url not found from ${baseUrl.src}`);
25
+ }
26
+ const urlO = new URL(baseUrl.url.toString());
27
+ urlO.pathname = pathOps.dirname(urlO.pathname);
28
+ if (baseUrl.url.protocol.startsWith("file")) {
29
+ const rt = runtimeFn();
30
+ const fname = opts.pathCleaner(baseUrl.url.pathname, localPath, "normal");
31
+ if (rt.isNodeIsh || rt.isDeno) {
32
+ try {
33
+ const out = await callFsReadFile(opts.mock).then((fn) => fn(fname));
34
+ const txt = new TextDecoder().decode(out);
35
+ return Result.Ok(txt);
36
+ }
37
+ catch (e) {
38
+ console.warn("fs direct access failed:", baseUrl.url.pathname, baseUrl.src, e);
39
+ }
40
+ }
41
+ if (baseUrl.src === "import.meta.url") {
42
+ return loadAssetReal(fallBackBaseUrl(opts), localPath, opts);
43
+ }
44
+ return Result.Err(`cannot load file: ${baseUrl.url.toString()} from ${baseUrl.src}`);
45
+ }
46
+ switch (baseUrl.src) {
47
+ case "opts.fallBackUrl":
48
+ baseUrl.url.pathname = opts.pathCleaner(baseUrl.url.pathname, localPath, "fallback");
49
+ break;
50
+ case "import.meta.url":
51
+ baseUrl.url.pathname = opts.pathCleaner(baseUrl.url.pathname, localPath, "normal");
52
+ break;
53
+ }
54
+ const rRes = await exception2Result(() => callFetch(opts.mock)(baseUrl.url));
55
+ if (rRes.isErr()) {
56
+ if (baseUrl.src === "import.meta.url") {
57
+ console.warn(`fetch failed for: ${baseUrl.url}`);
58
+ return loadAssetReal(fallBackBaseUrl(opts), localPath, opts);
59
+ }
60
+ return Result.Err(rRes);
61
+ }
62
+ if (!rRes.Ok().ok) {
63
+ if (baseUrl.src === "import.meta.url") {
64
+ console.warn(`fetch return !ok for: ${baseUrl.url}`);
65
+ return loadAssetReal(fallBackBaseUrl(opts), localPath, opts);
66
+ }
67
+ return Result.Err(`Fetch failed: ${baseUrl.url.toString()} ${rRes.Ok().status} ${rRes.Ok().statusText}`);
68
+ }
69
+ return Result.Ok(await rRes.Ok().text());
70
+ }
71
+ //# sourceMappingURL=load-asset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-asset.js","sourceRoot":"","sources":["../../../src/load-asset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=load-asset.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-asset.test.d.ts","sourceRoot":"","sources":["../../../src/load-asset.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { loadAsset } from "./load-asset.js";
3
+ import { runtimeFn } from "./runtime.js";
4
+ describe("loadAsset", () => {
5
+ if (!runtimeFn().isCFWorker) {
6
+ it("returns file content using fetch", async () => {
7
+ const result = await loadAsset("version.ts", {
8
+ fallBackUrl: "not://working/x",
9
+ pathCleaner: (base, localPath) => `${base}/./${localPath}`,
10
+ });
11
+ expect(result.isOk()).toBe(true);
12
+ expect(result.Ok()).toContain("VERSION");
13
+ });
14
+ it("returns file content from fallback", async () => {
15
+ const result = await loadAsset("version.ts", {
16
+ fallBackUrl: runtimeFn().isBrowser ? import.meta.url : "file://./",
17
+ pathCleaner: (base, localPath) => `${base}/${localPath}`,
18
+ });
19
+ expect(result.isOk()).toBe(true);
20
+ expect(result.Ok()).toContain("VERSION");
21
+ });
22
+ }
23
+ else {
24
+ it("do nothing", () => {
25
+ assert(true);
26
+ });
27
+ }
28
+ });
29
+ //# sourceMappingURL=load-asset.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-asset.test.js","sourceRoot":"","sources":["../../../src/load-asset.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;IAC1B,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,EAAE,CAAC;QAC5B,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE;gBAC3C,WAAW,EAAE,iBAAiB;gBAC9B,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,GAAG,IAAI,MAAM,SAAS,EAAE;aAC3D,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAAA,CAC1C,CAAC,CAAC;QACH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE;gBAC3C,WAAW,EAAE,SAAS,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;gBAClE,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,SAAS,EAAE;aACzD,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAAA,CAC1C,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,CAAC;QAAA,CACd,CAAC,CAAC;IACL,CAAC;AAAA,CACF,CAAC,CAAC"}
package/esm/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const VERSION = "0.4.27";
1
+ export const VERSION = "0.4.28";
2
2
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adviser/cement",
3
- "version": "0.4.27",
3
+ "version": "0.4.28",
4
4
  "description": "better try/catch/finally handling",
5
5
  "main": "./cjs/index.js",
6
6
  "type": "module",
@@ -0,0 +1,101 @@
1
+ import { pathOps } from "./path-ops.js";
2
+ import { Result, exception2Result } from "./result.js";
3
+ import { runtimeFn } from "./runtime.js";
4
+ import { CoerceURI, URI } from "./uri.js";
5
+
6
+ interface MockLoadAsset {
7
+ fetch: typeof globalThis.fetch;
8
+ fsReadFile: (fname: string) => Promise<Uint8Array>;
9
+ }
10
+
11
+ function callFetch(mock?: Partial<MockLoadAsset>): typeof globalThis.fetch {
12
+ return mock?.fetch ? mock.fetch : globalThis.fetch;
13
+ }
14
+
15
+ async function callFsReadFile(mock?: Partial<MockLoadAsset>): Promise<MockLoadAsset["fsReadFile"]> {
16
+ if (mock?.fsReadFile) {
17
+ return mock.fsReadFile;
18
+ }
19
+ const fs = await import("fs");
20
+ return (fname: string) => fs.promises.readFile(fname);
21
+ }
22
+
23
+ export interface LoadAssetOptions {
24
+ readonly fallBackUrl: CoerceURI;
25
+ readonly pathCleaner: (base: string, localPath: string, mode: "fallback" | "normal") => string;
26
+ readonly mock: Partial<MockLoadAsset>;
27
+ }
28
+
29
+ function fallBackBaseUrl(opts: Partial<LoadAssetOptions>): { url?: URL; src: "opts.fallBackUrl" } {
30
+ return { url: opts.fallBackUrl ? URI.from(opts.fallBackUrl).asURL() : undefined, src: "opts.fallBackUrl" };
31
+ }
32
+
33
+ export async function loadAsset(localPath: string, opts: Partial<LoadAssetOptions> = {}): Promise<Result<string>> {
34
+ const base: {
35
+ url?: URL;
36
+ src: "import.meta.url" | "opts.fallBackUrl";
37
+ } = import.meta?.url ? { url: new URL(pathOps.dirname(import.meta.url)), src: "import.meta.url" } : fallBackBaseUrl(opts);
38
+ return loadAssetReal(base, localPath, opts);
39
+ }
40
+
41
+ async function loadAssetReal(
42
+ baseUrl: { url?: URL; src: "import.meta.url" | "opts.fallBackUrl" },
43
+ localPath: string,
44
+ opts: Partial<LoadAssetOptions>,
45
+ ): Promise<Result<string>> {
46
+ if (!baseUrl.url) {
47
+ return Result.Err(`base url not found from ${baseUrl.src}`);
48
+ }
49
+ const urlO = new URL(baseUrl.url.toString());
50
+ urlO.pathname = pathOps.dirname(urlO.pathname);
51
+ if (baseUrl.url.protocol.startsWith("file")) {
52
+ const rt = runtimeFn();
53
+ const fname = opts.pathCleaner(baseUrl.url.pathname, localPath, "normal");
54
+ if (rt.isNodeIsh || rt.isDeno) {
55
+ try {
56
+ const out = await callFsReadFile(opts.mock).then((fn) => fn(fname));
57
+ const txt = new TextDecoder().decode(out);
58
+ return Result.Ok(txt);
59
+ } catch (e) {
60
+ // eslint-disable-next-line no-console
61
+ console.warn("fs direct access failed:", baseUrl.url.pathname, baseUrl.src, e);
62
+ }
63
+ }
64
+ /*
65
+ baseUrl.url.pathname = fname;
66
+ const x = await fetch(baseUrl.url);
67
+ console.log("fetched", baseUrl.url, x.ok, x.status);
68
+ */
69
+
70
+ if (baseUrl.src === "import.meta.url") {
71
+ return loadAssetReal(fallBackBaseUrl(opts), localPath, opts);
72
+ }
73
+ return Result.Err(`cannot load file: ${baseUrl.url.toString()} from ${baseUrl.src}`);
74
+ }
75
+ switch (baseUrl.src) {
76
+ case "opts.fallBackUrl":
77
+ baseUrl.url.pathname = opts.pathCleaner(baseUrl.url.pathname, localPath, "fallback");
78
+ break;
79
+ case "import.meta.url":
80
+ baseUrl.url.pathname = opts.pathCleaner(baseUrl.url.pathname, localPath, "normal");
81
+ break;
82
+ }
83
+ const rRes = await exception2Result(() => callFetch(opts.mock)(baseUrl.url));
84
+ if (rRes.isErr()) {
85
+ if (baseUrl.src === "import.meta.url") {
86
+ // eslint-disable-next-line no-console
87
+ console.warn(`fetch failed for: ${baseUrl.url}`);
88
+ return loadAssetReal(fallBackBaseUrl(opts), localPath, opts);
89
+ }
90
+ return Result.Err(rRes);
91
+ }
92
+ if (!rRes.Ok().ok) {
93
+ if (baseUrl.src === "import.meta.url") {
94
+ // eslint-disable-next-line no-console
95
+ console.warn(`fetch return !ok for: ${baseUrl.url}`);
96
+ return loadAssetReal(fallBackBaseUrl(opts), localPath, opts);
97
+ }
98
+ return Result.Err(`Fetch failed: ${baseUrl.url.toString()} ${rRes.Ok().status} ${rRes.Ok().statusText}`);
99
+ }
100
+ return Result.Ok(await rRes.Ok().text());
101
+ }
@@ -0,0 +1,14 @@
1
+ import { Result } from "./result.js";
2
+ import { CoerceURI } from "./uri.js";
3
+ interface MockLoadAsset {
4
+ fetch: typeof globalThis.fetch;
5
+ fsReadFile: (fname: string) => Promise<Uint8Array>;
6
+ }
7
+ export interface LoadAssetOptions {
8
+ readonly fallBackUrl: CoerceURI;
9
+ readonly pathCleaner: (base: string, localPath: string, mode: "fallback" | "normal") => string;
10
+ readonly mock: Partial<MockLoadAsset>;
11
+ }
12
+ export declare function loadAsset(localPath: string, opts?: Partial<LoadAssetOptions>): Promise<Result<string>>;
13
+ export {};
14
+ //# sourceMappingURL=load-asset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-asset.d.ts","sourceRoot":"","sources":["../../../src/load-asset.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAoB,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAO,MAAM,UAAU,CAAC;AAE1C,UAAU,aAAa;IACrB,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC/B,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CACpD;AAcD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,QAAQ,KAAK,MAAM,CAAC;IAC/F,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CACvC;AAMD,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,OAAO,CAAC,gBAAgB,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAMhH"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.loadAsset = loadAsset;
37
+ const path_ops_js_1 = require("./path-ops.js");
38
+ const result_js_1 = require("./result.js");
39
+ const runtime_js_1 = require("./runtime.js");
40
+ const uri_js_1 = require("./uri.js");
41
+ function callFetch(mock) {
42
+ return mock?.fetch ? mock.fetch : globalThis.fetch;
43
+ }
44
+ async function callFsReadFile(mock) {
45
+ if (mock?.fsReadFile) {
46
+ return mock.fsReadFile;
47
+ }
48
+ const fs = await Promise.resolve().then(() => __importStar(require("fs")));
49
+ return (fname) => fs.promises.readFile(fname);
50
+ }
51
+ function fallBackBaseUrl(opts) {
52
+ return { url: opts.fallBackUrl ? uri_js_1.URI.from(opts.fallBackUrl).asURL() : undefined, src: "opts.fallBackUrl" };
53
+ }
54
+ async function loadAsset(localPath, opts = {}) {
55
+ const base = import.meta?.url ? { url: new URL(path_ops_js_1.pathOps.dirname(import.meta.url)), src: "import.meta.url" } : fallBackBaseUrl(opts);
56
+ return loadAssetReal(base, localPath, opts);
57
+ }
58
+ async function loadAssetReal(baseUrl, localPath, opts) {
59
+ if (!baseUrl.url) {
60
+ return result_js_1.Result.Err(`base url not found from ${baseUrl.src}`);
61
+ }
62
+ const urlO = new URL(baseUrl.url.toString());
63
+ urlO.pathname = path_ops_js_1.pathOps.dirname(urlO.pathname);
64
+ if (baseUrl.url.protocol.startsWith("file")) {
65
+ const rt = (0, runtime_js_1.runtimeFn)();
66
+ const fname = opts.pathCleaner(baseUrl.url.pathname, localPath, "normal");
67
+ if (rt.isNodeIsh || rt.isDeno) {
68
+ try {
69
+ const out = await callFsReadFile(opts.mock).then((fn) => fn(fname));
70
+ const txt = new TextDecoder().decode(out);
71
+ return result_js_1.Result.Ok(txt);
72
+ }
73
+ catch (e) {
74
+ console.warn("fs direct access failed:", baseUrl.url.pathname, baseUrl.src, e);
75
+ }
76
+ }
77
+ if (baseUrl.src === "import.meta.url") {
78
+ return loadAssetReal(fallBackBaseUrl(opts), localPath, opts);
79
+ }
80
+ return result_js_1.Result.Err(`cannot load file: ${baseUrl.url.toString()} from ${baseUrl.src}`);
81
+ }
82
+ switch (baseUrl.src) {
83
+ case "opts.fallBackUrl":
84
+ baseUrl.url.pathname = opts.pathCleaner(baseUrl.url.pathname, localPath, "fallback");
85
+ break;
86
+ case "import.meta.url":
87
+ baseUrl.url.pathname = opts.pathCleaner(baseUrl.url.pathname, localPath, "normal");
88
+ break;
89
+ }
90
+ const rRes = await (0, result_js_1.exception2Result)(() => callFetch(opts.mock)(baseUrl.url));
91
+ if (rRes.isErr()) {
92
+ if (baseUrl.src === "import.meta.url") {
93
+ console.warn(`fetch failed for: ${baseUrl.url}`);
94
+ return loadAssetReal(fallBackBaseUrl(opts), localPath, opts);
95
+ }
96
+ return result_js_1.Result.Err(rRes);
97
+ }
98
+ if (!rRes.Ok().ok) {
99
+ if (baseUrl.src === "import.meta.url") {
100
+ console.warn(`fetch return !ok for: ${baseUrl.url}`);
101
+ return loadAssetReal(fallBackBaseUrl(opts), localPath, opts);
102
+ }
103
+ return result_js_1.Result.Err(`Fetch failed: ${baseUrl.url.toString()} ${rRes.Ok().status} ${rRes.Ok().statusText}`);
104
+ }
105
+ return result_js_1.Result.Ok(await rRes.Ok().text());
106
+ }
107
+ //# sourceMappingURL=load-asset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-asset.js","sourceRoot":"","sources":["../../../src/load-asset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=load-asset.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-asset.test.d.ts","sourceRoot":"","sources":["../../../src/load-asset.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const load_asset_js_1 = require("./load-asset.js");
5
+ const runtime_js_1 = require("./runtime.js");
6
+ (0, vitest_1.describe)("loadAsset", () => {
7
+ if (!(0, runtime_js_1.runtimeFn)().isCFWorker) {
8
+ (0, vitest_1.it)("returns file content using fetch", async () => {
9
+ const result = await (0, load_asset_js_1.loadAsset)("version.ts", {
10
+ fallBackUrl: "not://working/x",
11
+ pathCleaner: (base, localPath) => `${base}/./${localPath}`,
12
+ });
13
+ (0, vitest_1.expect)(result.isOk()).toBe(true);
14
+ (0, vitest_1.expect)(result.Ok()).toContain("VERSION");
15
+ });
16
+ (0, vitest_1.it)("returns file content from fallback", async () => {
17
+ const result = await (0, load_asset_js_1.loadAsset)("version.ts", {
18
+ fallBackUrl: (0, runtime_js_1.runtimeFn)().isBrowser ? import.meta.url : "file://./",
19
+ pathCleaner: (base, localPath) => `${base}/${localPath}`,
20
+ });
21
+ (0, vitest_1.expect)(result.isOk()).toBe(true);
22
+ (0, vitest_1.expect)(result.Ok()).toContain("VERSION");
23
+ });
24
+ }
25
+ else {
26
+ (0, vitest_1.it)("do nothing", () => {
27
+ assert(true);
28
+ });
29
+ }
30
+ });
31
+ //# sourceMappingURL=load-asset.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-asset.test.js","sourceRoot":"","sources":["../../../src/load-asset.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,mDAA4C;AAC5C,6CAAyC;AAEzC,IAAA,iBAAQ,EAAC,WAAW,EAAE,GAAG,EAAE,CAAC;IAC1B,IAAI,CAAC,IAAA,sBAAS,GAAE,CAAC,UAAU,EAAE,CAAC;QAC5B,IAAA,WAAE,EAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAS,EAAC,YAAY,EAAE;gBAC3C,WAAW,EAAE,iBAAiB;gBAC9B,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,GAAG,IAAI,MAAM,SAAS,EAAE;aAC3D,CAAC,CAAC;YACH,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,IAAA,eAAM,EAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAAA,CAC1C,CAAC,CAAC;QACH,IAAA,WAAE,EAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAS,EAAC,YAAY,EAAE;gBAC3C,WAAW,EAAE,IAAA,sBAAS,GAAE,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;gBAClE,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,SAAS,EAAE;aACzD,CAAC,CAAC;YACH,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,IAAA,eAAM,EAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAAA,CAC1C,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,IAAA,WAAE,EAAC,YAAY,EAAE,GAAG,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,CAAC;QAAA,CACd,CAAC,CAAC;IACL,CAAC;AAAA,CACF,CAAC,CAAC"}
package/ts/cjs/version.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.VERSION = void 0;
4
- exports.VERSION = "0.4.27";
4
+ exports.VERSION = "0.4.28";
5
5
  //# sourceMappingURL=version.js.map
@@ -0,0 +1,14 @@
1
+ import { Result } from "./result.js";
2
+ import { CoerceURI } from "./uri.js";
3
+ interface MockLoadAsset {
4
+ fetch: typeof globalThis.fetch;
5
+ fsReadFile: (fname: string) => Promise<Uint8Array>;
6
+ }
7
+ export interface LoadAssetOptions {
8
+ readonly fallBackUrl: CoerceURI;
9
+ readonly pathCleaner: (base: string, localPath: string, mode: "fallback" | "normal") => string;
10
+ readonly mock: Partial<MockLoadAsset>;
11
+ }
12
+ export declare function loadAsset(localPath: string, opts?: Partial<LoadAssetOptions>): Promise<Result<string>>;
13
+ export {};
14
+ //# sourceMappingURL=load-asset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-asset.d.ts","sourceRoot":"","sources":["../../../src/load-asset.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAoB,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAO,MAAM,UAAU,CAAC;AAE1C,UAAU,aAAa;IACrB,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC/B,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CACpD;AAcD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,QAAQ,KAAK,MAAM,CAAC;IAC/F,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CACvC;AAMD,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,OAAO,CAAC,gBAAgB,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAMhH"}
@@ -0,0 +1,71 @@
1
+ import { pathOps } from "./path-ops.js";
2
+ import { Result, exception2Result } from "./result.js";
3
+ import { runtimeFn } from "./runtime.js";
4
+ import { URI } from "./uri.js";
5
+ function callFetch(mock) {
6
+ return mock?.fetch ? mock.fetch : globalThis.fetch;
7
+ }
8
+ async function callFsReadFile(mock) {
9
+ if (mock?.fsReadFile) {
10
+ return mock.fsReadFile;
11
+ }
12
+ const fs = await import("fs");
13
+ return (fname) => fs.promises.readFile(fname);
14
+ }
15
+ function fallBackBaseUrl(opts) {
16
+ return { url: opts.fallBackUrl ? URI.from(opts.fallBackUrl).asURL() : undefined, src: "opts.fallBackUrl" };
17
+ }
18
+ export async function loadAsset(localPath, opts = {}) {
19
+ const base = import.meta?.url ? { url: new URL(pathOps.dirname(import.meta.url)), src: "import.meta.url" } : fallBackBaseUrl(opts);
20
+ return loadAssetReal(base, localPath, opts);
21
+ }
22
+ async function loadAssetReal(baseUrl, localPath, opts) {
23
+ if (!baseUrl.url) {
24
+ return Result.Err(`base url not found from ${baseUrl.src}`);
25
+ }
26
+ const urlO = new URL(baseUrl.url.toString());
27
+ urlO.pathname = pathOps.dirname(urlO.pathname);
28
+ if (baseUrl.url.protocol.startsWith("file")) {
29
+ const rt = runtimeFn();
30
+ const fname = opts.pathCleaner(baseUrl.url.pathname, localPath, "normal");
31
+ if (rt.isNodeIsh || rt.isDeno) {
32
+ try {
33
+ const out = await callFsReadFile(opts.mock).then((fn) => fn(fname));
34
+ const txt = new TextDecoder().decode(out);
35
+ return Result.Ok(txt);
36
+ }
37
+ catch (e) {
38
+ console.warn("fs direct access failed:", baseUrl.url.pathname, baseUrl.src, e);
39
+ }
40
+ }
41
+ if (baseUrl.src === "import.meta.url") {
42
+ return loadAssetReal(fallBackBaseUrl(opts), localPath, opts);
43
+ }
44
+ return Result.Err(`cannot load file: ${baseUrl.url.toString()} from ${baseUrl.src}`);
45
+ }
46
+ switch (baseUrl.src) {
47
+ case "opts.fallBackUrl":
48
+ baseUrl.url.pathname = opts.pathCleaner(baseUrl.url.pathname, localPath, "fallback");
49
+ break;
50
+ case "import.meta.url":
51
+ baseUrl.url.pathname = opts.pathCleaner(baseUrl.url.pathname, localPath, "normal");
52
+ break;
53
+ }
54
+ const rRes = await exception2Result(() => callFetch(opts.mock)(baseUrl.url));
55
+ if (rRes.isErr()) {
56
+ if (baseUrl.src === "import.meta.url") {
57
+ console.warn(`fetch failed for: ${baseUrl.url}`);
58
+ return loadAssetReal(fallBackBaseUrl(opts), localPath, opts);
59
+ }
60
+ return Result.Err(rRes);
61
+ }
62
+ if (!rRes.Ok().ok) {
63
+ if (baseUrl.src === "import.meta.url") {
64
+ console.warn(`fetch return !ok for: ${baseUrl.url}`);
65
+ return loadAssetReal(fallBackBaseUrl(opts), localPath, opts);
66
+ }
67
+ return Result.Err(`Fetch failed: ${baseUrl.url.toString()} ${rRes.Ok().status} ${rRes.Ok().statusText}`);
68
+ }
69
+ return Result.Ok(await rRes.Ok().text());
70
+ }
71
+ //# sourceMappingURL=load-asset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-asset.js","sourceRoot":"","sources":["../../../src/load-asset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=load-asset.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-asset.test.d.ts","sourceRoot":"","sources":["../../../src/load-asset.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { loadAsset } from "./load-asset.js";
3
+ import { runtimeFn } from "./runtime.js";
4
+ describe("loadAsset", () => {
5
+ if (!runtimeFn().isCFWorker) {
6
+ it("returns file content using fetch", async () => {
7
+ const result = await loadAsset("version.ts", {
8
+ fallBackUrl: "not://working/x",
9
+ pathCleaner: (base, localPath) => `${base}/./${localPath}`,
10
+ });
11
+ expect(result.isOk()).toBe(true);
12
+ expect(result.Ok()).toContain("VERSION");
13
+ });
14
+ it("returns file content from fallback", async () => {
15
+ const result = await loadAsset("version.ts", {
16
+ fallBackUrl: runtimeFn().isBrowser ? import.meta.url : "file://./",
17
+ pathCleaner: (base, localPath) => `${base}/${localPath}`,
18
+ });
19
+ expect(result.isOk()).toBe(true);
20
+ expect(result.Ok()).toContain("VERSION");
21
+ });
22
+ }
23
+ else {
24
+ it("do nothing", () => {
25
+ assert(true);
26
+ });
27
+ }
28
+ });
29
+ //# sourceMappingURL=load-asset.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-asset.test.js","sourceRoot":"","sources":["../../../src/load-asset.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;IAC1B,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,EAAE,CAAC;QAC5B,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE;gBAC3C,WAAW,EAAE,iBAAiB;gBAC9B,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,GAAG,IAAI,MAAM,SAAS,EAAE;aAC3D,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAAA,CAC1C,CAAC,CAAC;QACH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE;gBAC3C,WAAW,EAAE,SAAS,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW;gBAClE,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,SAAS,EAAE;aACzD,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAAA,CAC1C,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,CAAC;QAAA,CACd,CAAC,CAAC;IACL,CAAC;AAAA,CACF,CAAC,CAAC"}
package/ts/esm/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const VERSION = "0.4.27";
1
+ export const VERSION = "0.4.28";
2
2
  //# sourceMappingURL=version.js.map