@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.
- package/cjs/load-asset.cjs +107 -0
- package/cjs/load-asset.cjs.map +1 -0
- package/cjs/load-asset.d.ts +14 -0
- package/cjs/load-asset.d.ts.map +1 -0
- package/cjs/load-asset.test.cjs +31 -0
- package/cjs/load-asset.test.cjs.map +1 -0
- package/cjs/load-asset.test.d.ts +2 -0
- package/cjs/load-asset.test.d.ts.map +1 -0
- package/cjs/version.cjs +1 -1
- package/deno.json +1 -1
- package/esm/load-asset.d.ts +14 -0
- package/esm/load-asset.d.ts.map +1 -0
- package/esm/load-asset.js +71 -0
- package/esm/load-asset.js.map +1 -0
- package/esm/load-asset.test.d.ts +2 -0
- package/esm/load-asset.test.d.ts.map +1 -0
- package/esm/load-asset.test.js +29 -0
- package/esm/load-asset.test.js.map +1 -0
- package/esm/version.js +1 -1
- package/package.json +1 -1
- package/src/load-asset.ts +101 -0
- package/ts/cjs/load-asset.d.ts +14 -0
- package/ts/cjs/load-asset.d.ts.map +1 -0
- package/ts/cjs/load-asset.js +107 -0
- package/ts/cjs/load-asset.js.map +1 -0
- package/ts/cjs/load-asset.test.d.ts +2 -0
- package/ts/cjs/load-asset.test.d.ts.map +1 -0
- package/ts/cjs/load-asset.test.js +31 -0
- package/ts/cjs/load-asset.test.js.map +1 -0
- package/ts/cjs/version.js +1 -1
- package/ts/esm/load-asset.d.ts +14 -0
- package/ts/esm/load-asset.d.ts.map +1 -0
- package/ts/esm/load-asset.js +71 -0
- package/ts/esm/load-asset.js.map +1 -0
- package/ts/esm/load-asset.test.d.ts +2 -0
- package/ts/esm/load-asset.test.d.ts.map +1 -0
- package/ts/esm/load-asset.test.js +29 -0
- package/ts/esm/load-asset.test.js.map +1 -0
- 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 @@
|
|
1
|
+
{"version":3,"file":"load-asset.test.d.ts","sourceRoot":"","sources":["../../../src/load-asset.test.ts"],"names":[],"mappings":""}
|
package/cjs/version.cjs
CHANGED
package/deno.json
CHANGED
@@ -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 @@
|
|
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.
|
1
|
+
export const VERSION = "0.4.28";
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
@@ -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 @@
|
|
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
@@ -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 @@
|
|
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.
|
1
|
+
export const VERSION = "0.4.28";
|
2
2
|
//# sourceMappingURL=version.js.map
|