fuma-content 1.1.2 → 1.1.4
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/dist/async-cache-BVuJiIDT.d.ts +9 -0
- package/dist/async-cache-BVuJiIDT.d.ts.map +1 -0
- package/dist/{async-cache-U87GzQTb.js → async-cache-DRmFaVGm.js} +1 -1
- package/dist/{async-cache-U87GzQTb.js.map → async-cache-DRmFaVGm.js.map} +1 -1
- package/dist/build-mdx-DRqbcE1d.d.ts +79 -0
- package/dist/build-mdx-DRqbcE1d.d.ts.map +1 -0
- package/dist/{build-mdx-CUp6FpfT.js → build-mdx-DgzggXIL.js} +27 -40
- package/dist/build-mdx-DgzggXIL.js.map +1 -0
- package/dist/bun/index.d.ts +1 -1
- package/dist/bun/index.d.ts.map +1 -1
- package/dist/bun/index.js +2 -2
- package/dist/{bun-CBROq3I0.js → bun-Be5pgXW_.js} +4 -3
- package/dist/bun-Be5pgXW_.js.map +1 -0
- package/dist/{code-generator-Qhhq7kHh.js → code-generator-CHcOrCeM.js} +5 -7
- package/dist/code-generator-CHcOrCeM.js.map +1 -0
- package/dist/collections/data/runtime.d.ts +3 -6
- package/dist/collections/data/runtime.d.ts.map +1 -1
- package/dist/collections/data/runtime.js.map +1 -1
- package/dist/collections/data.d.ts +4 -4
- package/dist/collections/data.d.ts.map +1 -1
- package/dist/collections/data.js +158 -4
- package/dist/collections/data.js.map +1 -0
- package/dist/collections/fs.d.ts +45 -3
- package/dist/collections/fs.d.ts.map +1 -0
- package/dist/collections/fs.js +65 -2
- package/dist/collections/fs.js.map +1 -0
- package/dist/collections/index.d.ts +37 -2
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/index.js +37 -2
- package/dist/collections/index.js.map +1 -0
- package/dist/collections/json/loader-webpack.d.ts +3 -3
- package/dist/collections/json/loader-webpack.d.ts.map +1 -1
- package/dist/collections/json/loader-webpack.js +3 -7
- package/dist/collections/json/loader-webpack.js.map +1 -1
- package/dist/collections/mdx/loader-webpack.d.ts +3 -3
- package/dist/collections/mdx/loader-webpack.d.ts.map +1 -1
- package/dist/collections/mdx/loader-webpack.js +3 -8
- package/dist/collections/mdx/loader-webpack.js.map +1 -1
- package/dist/collections/mdx/react.d.ts +3 -10
- package/dist/collections/mdx/react.d.ts.map +1 -1
- package/dist/collections/mdx/react.js +2 -1
- package/dist/collections/mdx/react.js.map +1 -1
- package/dist/collections/mdx/runtime-browser.d.ts +25 -11
- package/dist/collections/mdx/runtime-browser.d.ts.map +1 -0
- package/dist/collections/mdx/runtime-browser.js +2 -2
- package/dist/collections/mdx/runtime-browser.js.map +1 -1
- package/dist/collections/mdx/runtime-dynamic.d.ts +6 -10
- package/dist/collections/mdx/runtime-dynamic.d.ts.map +1 -1
- package/dist/collections/mdx/runtime-dynamic.js +15 -13
- package/dist/collections/mdx/runtime-dynamic.js.map +1 -1
- package/dist/collections/mdx/runtime.d.ts +26 -10
- package/dist/collections/mdx/runtime.d.ts.map +1 -0
- package/dist/collections/mdx/runtime.js.map +1 -1
- package/dist/collections/mdx.d.ts +66 -6
- package/dist/collections/mdx.d.ts.map +1 -0
- package/dist/collections/mdx.js +316 -6
- package/dist/collections/mdx.js.map +1 -0
- package/dist/collections/obsidian.d.ts +10 -0
- package/dist/collections/obsidian.d.ts.map +1 -0
- package/dist/collections/obsidian.js +497 -0
- package/dist/collections/obsidian.js.map +1 -0
- package/dist/collections/runtime/file-store.d.ts +21 -4
- package/dist/collections/runtime/file-store.d.ts.map +1 -0
- package/dist/collections/runtime/file-store.js +1 -1
- package/dist/collections/runtime/store.d.ts +31 -3
- package/dist/collections/runtime/store.d.ts.map +1 -0
- package/dist/collections/runtime/store.js +33 -2
- package/dist/collections/runtime/store.js.map +1 -0
- package/dist/collections/yaml/loader-webpack.d.ts +3 -3
- package/dist/collections/yaml/loader-webpack.d.ts.map +1 -1
- package/dist/collections/yaml/loader-webpack.js +3 -7
- package/dist/collections/yaml/loader-webpack.js.map +1 -1
- package/dist/config/index.d.ts +35 -2
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js.map +1 -1
- package/dist/{core-Uv3jZqL-.js → core-BuUsOElL.js} +9 -9
- package/dist/core-BuUsOElL.js.map +1 -0
- package/dist/{core-CT06v32N.d.ts → core-FjA_Xoho.d.ts} +4 -67
- package/dist/core-FjA_Xoho.d.ts.map +1 -0
- package/dist/dynamic.d.ts +25 -3
- package/dist/dynamic.d.ts.map +1 -0
- package/dist/dynamic.js +28 -2
- package/dist/dynamic.js.map +1 -0
- package/dist/{fuma-matter-BuBO2w-p.js → fuma-matter-B4gT09gM.js} +1 -1
- package/dist/fuma-matter-B4gT09gM.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/is-promise-like-DYHv0Yap.js +8 -0
- package/dist/is-promise-like-DYHv0Yap.js.map +1 -0
- package/dist/{load-from-file-z7EGuf2n.js → load-from-file-BhdBOcQT.js} +4 -2
- package/dist/{load-from-file-z7EGuf2n.js.map → load-from-file-BhdBOcQT.js.map} +1 -1
- package/dist/load-from-file-CIYdu-B5.d.ts +10 -0
- package/dist/load-from-file-CIYdu-B5.d.ts.map +1 -0
- package/dist/loader-BOYLUNfh.js +18 -0
- package/dist/{loader-BK8PnqRg.js.map → loader-BOYLUNfh.js.map} +1 -1
- package/dist/{loader-CnksfM7I.js → loader-BT4fwLTJ.js} +13 -7
- package/dist/loader-BT4fwLTJ.js.map +1 -0
- package/dist/loader-Cb9kSSxT.js +19 -0
- package/dist/{loader-Cnz-VHne.js.map → loader-Cb9kSSxT.js.map} +1 -1
- package/dist/{loader-CuntMmR4.js → loader-UhlX4xbz.js} +3 -3
- package/dist/loader-UhlX4xbz.js.map +1 -0
- package/dist/next/index.d.ts +1 -1
- package/dist/next/index.d.ts.map +1 -1
- package/dist/next/index.js +3 -3
- package/dist/next/index.js.map +1 -1
- package/dist/node/index.d.ts +1 -1
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/loader.d.ts +1 -1
- package/dist/node/loader.d.ts.map +1 -1
- package/dist/node/loader.js +8 -8
- package/dist/node/loader.js.map +1 -1
- package/dist/{node-2VZOh3P9.js → node-Cu5Pqxxo.js} +2 -2
- package/dist/node-Cu5Pqxxo.js.map +1 -0
- package/dist/{collections-CNWuMDAZ.js → pipe-CvCqOpXX.js} +2 -36
- package/dist/pipe-CvCqOpXX.js.map +1 -0
- package/dist/plugins/git.d.ts +38 -3
- package/dist/plugins/git.d.ts.map +1 -0
- package/dist/plugins/git.js +60 -2
- package/dist/plugins/git.js.map +1 -0
- package/dist/plugins/json-schema.d.ts +2 -1
- package/dist/plugins/json-schema.d.ts.map +1 -1
- package/dist/plugins/json-schema.js +2 -2
- package/dist/plugins/json-schema.js.map +1 -1
- package/dist/plugins/loader/index.d.ts +72 -4
- package/dist/plugins/loader/index.d.ts.map +1 -0
- package/dist/plugins/loader/index.js +77 -2
- package/dist/plugins/loader/index.js.map +1 -0
- package/dist/plugins/loader/webpack.d.ts +21 -4
- package/dist/plugins/loader/webpack.d.ts.map +1 -0
- package/dist/plugins/loader/webpack.js +7 -5
- package/dist/plugins/loader/webpack.js.map +1 -1
- package/dist/rolldown-runtime-CjeV3_4I.js +18 -0
- package/dist/{validation-BvVvvLII.js → validation-C3kXuveD.js} +1 -1
- package/dist/{validation-BvVvvLII.js.map → validation-C3kXuveD.js.map} +1 -1
- package/dist/vite/index.d.ts +1 -1
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +4 -15
- package/dist/vite/index.js.map +1 -1
- package/dist/{vite-C1qXY47G.js → vite-CoJIMNWk.js} +4 -4
- package/dist/vite-CoJIMNWk.js.map +1 -0
- package/package.json +27 -11
- package/dist/build-mdx-CUp6FpfT.js.map +0 -1
- package/dist/build-mdx-D6zM3Sgl.js +0 -4
- package/dist/bun-CBROq3I0.js.map +0 -1
- package/dist/code-generator-Qhhq7kHh.js.map +0 -1
- package/dist/collections-CNWuMDAZ.js.map +0 -1
- package/dist/core-CT06v32N.d.ts.map +0 -1
- package/dist/core-Uv3jZqL-.js.map +0 -1
- package/dist/data-Cxsx5KPD.js +0 -159
- package/dist/data-Cxsx5KPD.js.map +0 -1
- package/dist/dynamic-Ck1wYoaL.d.ts +0 -33
- package/dist/dynamic-Ck1wYoaL.d.ts.map +0 -1
- package/dist/dynamic-CtOB4Rkp.js +0 -29
- package/dist/dynamic-CtOB4Rkp.js.map +0 -1
- package/dist/file-store-Dm1SjuLg.d.ts +0 -20
- package/dist/file-store-Dm1SjuLg.d.ts.map +0 -1
- package/dist/fs-CXzVd2Dp.js +0 -68
- package/dist/fs-CXzVd2Dp.js.map +0 -1
- package/dist/fs-CmwaaFyx.d.ts +0 -45
- package/dist/fs-CmwaaFyx.d.ts.map +0 -1
- package/dist/fuma-matter-BuBO2w-p.js.map +0 -1
- package/dist/git-DnejL9r_.js +0 -60
- package/dist/git-DnejL9r_.js.map +0 -1
- package/dist/git-n-9ddn78.d.ts +0 -37
- package/dist/git-n-9ddn78.d.ts.map +0 -1
- package/dist/index-BheUVWBm.d.ts +0 -87
- package/dist/index-BheUVWBm.d.ts.map +0 -1
- package/dist/load-from-file-D-Xm95Fz.js +0 -3
- package/dist/loader-B4nQrRwA.js +0 -77
- package/dist/loader-B4nQrRwA.js.map +0 -1
- package/dist/loader-B6ordrWK.js +0 -9
- package/dist/loader-BK8PnqRg.js +0 -16
- package/dist/loader-CnksfM7I.js.map +0 -1
- package/dist/loader-Cnz-VHne.js +0 -17
- package/dist/loader-CuntMmR4.js.map +0 -1
- package/dist/loader-Cx1Rg_VM.js +0 -8
- package/dist/loader-Dao_nv3e.js +0 -8
- package/dist/mdx-Cw1nBJ0D.js +0 -306
- package/dist/mdx-Cw1nBJ0D.js.map +0 -1
- package/dist/mdx-PaqRNZMS.d.ts +0 -135
- package/dist/mdx-PaqRNZMS.d.ts.map +0 -1
- package/dist/node-2VZOh3P9.js.map +0 -1
- package/dist/runtime-BUUHSFlR.d.ts +0 -31
- package/dist/runtime-BUUHSFlR.d.ts.map +0 -1
- package/dist/runtime-browser-B70WGxeQ.d.ts +0 -29
- package/dist/runtime-browser-B70WGxeQ.d.ts.map +0 -1
- package/dist/store-CRyvZFKN.js +0 -34
- package/dist/store-CRyvZFKN.js.map +0 -1
- package/dist/store-D_PPrdRE.d.ts +0 -31
- package/dist/store-D_PPrdRE.d.ts.map +0 -1
- package/dist/vite-C1qXY47G.js.map +0 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { t as __exportAll } from "./rolldown-runtime-CjeV3_4I.js";
|
|
2
|
+
import { t as createDataLoader } from "./loader-UhlX4xbz.js";
|
|
3
|
+
import { load } from "js-yaml";
|
|
4
|
+
|
|
5
|
+
//#region src/collections/yaml/loader.ts
|
|
6
|
+
var loader_exports = /* @__PURE__ */ __exportAll({ createYamlLoader: () => createYamlLoader });
|
|
7
|
+
function createYamlLoader(core) {
|
|
8
|
+
return createDataLoader(core, (filePath, source) => {
|
|
9
|
+
try {
|
|
10
|
+
return load(source);
|
|
11
|
+
} catch (e) {
|
|
12
|
+
throw new Error(`invalid data in ${filePath}`, { cause: e });
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
//#endregion
|
|
18
|
+
export { loader_exports as n, createYamlLoader as t };
|
|
19
|
+
//# sourceMappingURL=loader-Cb9kSSxT.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader-
|
|
1
|
+
{"version":3,"file":"loader-Cb9kSSxT.js","names":[],"sources":["../src/collections/yaml/loader.ts"],"sourcesContent":["import type { Loader } from \"@/plugins/loader\";\nimport { load } from \"js-yaml\";\nimport type { DynamicCore } from \"@/dynamic\";\nimport { createDataLoader } from \"../data/loader\";\n\nexport function createYamlLoader(core: DynamicCore): Loader {\n return createDataLoader(core, (filePath, source) => {\n try {\n return load(source) as Record<string, unknown>;\n } catch (e) {\n throw new Error(`invalid data in ${filePath}`, { cause: e });\n }\n });\n}\n"],"mappings":";;;;;;AAKA,SAAgB,iBAAiB,MAA2B;AAC1D,QAAO,iBAAiB,OAAO,UAAU,WAAW;AAClD,MAAI;AACF,UAAO,KAAK,OAAO;WACZ,GAAG;AACV,SAAM,IAAI,MAAM,mBAAmB,YAAY,EAAE,OAAO,GAAG,CAAC;;GAE9D"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { r as validate } from "./validation-
|
|
2
|
-
import {
|
|
1
|
+
import { r as validate } from "./validation-C3kXuveD.js";
|
|
2
|
+
import { DataCollection } from "./collections/data.js";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
|
|
5
5
|
//#region src/collections/data/loader.ts
|
|
@@ -56,4 +56,4 @@ function createDataLoader({ getCore }, parse, moduleType = "js") {
|
|
|
56
56
|
|
|
57
57
|
//#endregion
|
|
58
58
|
export { createDataLoader as t };
|
|
59
|
-
//# sourceMappingURL=loader-
|
|
59
|
+
//# sourceMappingURL=loader-UhlX4xbz.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader-UhlX4xbz.js","names":[],"sources":["../src/collections/data/loader.ts"],"sourcesContent":["import type { Loader, LoaderInput } from \"@/plugins/loader\";\nimport { z } from \"zod\";\nimport { validate } from \"@/utils/validation\";\nimport { DataCollection, type DataTransformationContext } from \"@/collections/data\";\nimport type { DynamicCore } from \"@/dynamic\";\n\nconst querySchema = z\n .object({\n collection: z.string().optional(),\n workspace: z.string().optional(),\n })\n .loose();\n\n/**\n * load data files, fallback to bundler's built-in plugins when ?collection is unspecified.\n */\nexport function createDataLoader(\n { getCore }: DynamicCore,\n parse: (filePath: string, source: string) => Record<string, unknown>,\n moduleType: \"json\" | \"js\" = \"js\",\n): Loader {\n function getCollectionProcessor({ filePath, query }: LoaderInput) {\n const parsed = querySchema.safeParse(query);\n if (!parsed.success || !parsed.data.collection) return null;\n const { collection: collectionName, workspace } = parsed.data;\n\n return async (source: string): Promise<unknown> => {\n let core = await getCore();\n if (workspace) {\n core = core.getWorkspaces().get(workspace) ?? core;\n }\n\n let collection = core.getCollection(collectionName);\n let data: unknown = parse(filePath, source);\n if (!collection || !(collection instanceof DataCollection)) return data;\n\n const context: DataTransformationContext = {\n path: filePath,\n source,\n };\n\n if (collection.schema) {\n data = await validate(collection.schema, data, context, `invalid data in ${filePath}`);\n }\n\n return collection.onLoad.run(data, context);\n };\n }\n\n return {\n async load(input) {\n const processor = getCollectionProcessor(input);\n if (processor === null) return null;\n const data = await processor(await input.getSource());\n\n if (moduleType === \"json\") {\n return {\n code: JSON.stringify(data),\n moduleType,\n };\n } else {\n return {\n code: `export default ${JSON.stringify(data)}`,\n };\n }\n },\n bun: {\n load(source, input) {\n const processor = getCollectionProcessor(input);\n if (processor === null)\n return {\n loader: \"object\",\n exports: parse(input.filePath, source),\n };\n\n return processor(source).then((data) => ({\n loader: \"object\",\n exports: { default: data },\n }));\n },\n },\n };\n}\n"],"mappings":";;;;;AAMA,MAAM,cAAc,EACjB,OAAO;CACN,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,WAAW,EAAE,QAAQ,CAAC,UAAU;CACjC,CAAC,CACD,OAAO;;;;AAKV,SAAgB,iBACd,EAAE,WACF,OACA,aAA4B,MACpB;CACR,SAAS,uBAAuB,EAAE,UAAU,SAAsB;EAChE,MAAM,SAAS,YAAY,UAAU,MAAM;AAC3C,MAAI,CAAC,OAAO,WAAW,CAAC,OAAO,KAAK,WAAY,QAAO;EACvD,MAAM,EAAE,YAAY,gBAAgB,cAAc,OAAO;AAEzD,SAAO,OAAO,WAAqC;GACjD,IAAI,OAAO,MAAM,SAAS;AAC1B,OAAI,UACF,QAAO,KAAK,eAAe,CAAC,IAAI,UAAU,IAAI;GAGhD,IAAI,aAAa,KAAK,cAAc,eAAe;GACnD,IAAI,OAAgB,MAAM,UAAU,OAAO;AAC3C,OAAI,CAAC,cAAc,EAAE,sBAAsB,gBAAiB,QAAO;GAEnE,MAAM,UAAqC;IACzC,MAAM;IACN;IACD;AAED,OAAI,WAAW,OACb,QAAO,MAAM,SAAS,WAAW,QAAQ,MAAM,SAAS,mBAAmB,WAAW;AAGxF,UAAO,WAAW,OAAO,IAAI,MAAM,QAAQ;;;AAI/C,QAAO;EACL,MAAM,KAAK,OAAO;GAChB,MAAM,YAAY,uBAAuB,MAAM;AAC/C,OAAI,cAAc,KAAM,QAAO;GAC/B,MAAM,OAAO,MAAM,UAAU,MAAM,MAAM,WAAW,CAAC;AAErD,OAAI,eAAe,OACjB,QAAO;IACL,MAAM,KAAK,UAAU,KAAK;IAC1B;IACD;OAED,QAAO,EACL,MAAM,kBAAkB,KAAK,UAAU,KAAK,IAC7C;;EAGL,KAAK,EACH,KAAK,QAAQ,OAAO;GAClB,MAAM,YAAY,uBAAuB,MAAM;AAC/C,OAAI,cAAc,KAChB,QAAO;IACL,QAAQ;IACR,SAAS,MAAM,MAAM,UAAU,OAAO;IACvC;AAEH,UAAO,UAAU,OAAO,CAAC,MAAM,UAAU;IACvC,QAAQ;IACR,SAAS,EAAE,SAAS,MAAM;IAC3B,EAAE;KAEN;EACF"}
|
package/dist/next/index.d.ts
CHANGED
package/dist/next/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/next/index.ts"],"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/next/index.ts"],"mappings":";;;;UAOiB,WAAA,SAAoB,IAAA,CAAK,WAAA;;AAA1C;;;;EAME,KAAA;AAAA;AAAA,iBAGoB,aAAA,CAAc,OAAA,GAAS,WAAA,GAAgB,OAAA,EAAA,UAAA,GAiBvC,UAAA,KAAkB,UAAA;AAAA,iBA4DlB,oBAAA,CAAqB,OAAA,EAAS,WAAA,GAAW,OAAA,CAAA,IAAA"}
|
package/dist/next/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { t as Core } from "../core-
|
|
2
|
-
import {
|
|
3
|
-
import { t as loadConfig } from "../load-from-file-
|
|
1
|
+
import { t as Core } from "../core-BuUsOElL.js";
|
|
2
|
+
import { loaderPlugin } from "../plugins/loader/index.js";
|
|
3
|
+
import { t as loadConfig } from "../load-from-file-BhdBOcQT.js";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
|
|
6
6
|
//#region src/next/index.ts
|
package/dist/next/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/next/index.ts"],"sourcesContent":["import type { NextConfig } from \"next\";\nimport path from \"node:path\";\nimport { loadConfig } from \"@/config/load-from-file\";\nimport { Core, CoreOptions } from \"@/core\";\nimport type { FSWatcher } from \"chokidar\";\nimport { loaderPlugin } from \"@/plugins/loader\";\n\nexport interface NextOptions extends Pick<CoreOptions, \"cwd\" | \"configPath\" | \"outDir\"> {\n /**\n * clean output directory on start\n *\n * @defaultValue true\n */\n clean?: boolean;\n}\n\nexport async function createContent(options: NextOptions = {}) {\n const { clean = true } = options;\n const isFirstStart = process.env._FUMA_CONTENT !== \"1\";\n process.env._FUMA_CONTENT = \"1\";\n\n const core = createNextCore(options);\n if (clean && isFirstStart) {\n await core.clearOutputDirectory();\n }\n\n await core.init({\n config: loadConfig(core, true),\n });\n\n if (isFirstStart) {\n await init(process.env.NODE_ENV === \"development\", core);\n }\n return (nextConfig: NextConfig = {}): NextConfig => {\n const ctx = core.getPluginContext();\n for (const plugin of core.getPlugins(true)) {\n nextConfig = plugin.next?.config?.call(ctx, nextConfig) ?? nextConfig;\n }\n\n return nextConfig;\n };\n}\n\nasync function init(dev: boolean, core: Core): Promise<void> {\n await core.emit({ write: true });\n\n if (!dev) return;\n const { FSWatcher } = await import(\"chokidar\");\n const { configPath, outDir } = core.getOptions();\n const absoluteConfigPath = path.resolve(configPath);\n let watcher: FSWatcher | undefined;\n\n async function devServer() {\n if (watcher && !watcher.closed) {\n await watcher.close();\n }\n\n watcher = new FSWatcher({\n ignoreInitial: true,\n persistent: true,\n ignored: [outDir],\n });\n\n watcher.once(\"ready\", () => {\n console.log(\"[fuma-content] started dev server\");\n });\n\n watcher.on(\"all\", (_event, file) => {\n if (path.resolve(file) === absoluteConfigPath) {\n console.log(\"[fuma-content] restarting dev server\");\n watcher?.removeAllListeners();\n void (async () => {\n await core.init({\n config: loadConfig(core, true),\n });\n await devServer();\n await core.emit({ write: true });\n })();\n }\n });\n\n await core.initServer({ watcher });\n }\n\n process.on(\"exit\", () => {\n if (!watcher || watcher.closed) return;\n console.log(\"[fuma-content] closing dev server\");\n void watcher.close();\n });\n\n await devServer();\n}\n\nexport async function createStandaloneCore(options: NextOptions) {\n const core = createNextCore(options);\n await core.init({\n config: loadConfig(core, true),\n });\n return core;\n}\n\nfunction createNextCore({ configPath, cwd, outDir }: NextOptions): Core {\n return new Core({\n configPath,\n cwd,\n outDir,\n plugins: [loaderPlugin()],\n });\n}\n"],"mappings":";;;;;;AAgBA,eAAsB,cAAc,UAAuB,EAAE,EAAE;CAC7D,MAAM,EAAE,QAAQ,SAAS;CACzB,MAAM,eAAe,QAAQ,IAAI,kBAAkB;AACnD,SAAQ,IAAI,gBAAgB;CAE5B,MAAM,OAAO,eAAe,QAAQ;AACpC,KAAI,SAAS,aACX,OAAM,KAAK,sBAAsB;AAGnC,OAAM,KAAK,KAAK,EACd,QAAQ,WAAW,MAAM,KAAK,EAC/B,CAAC;AAEF,KAAI,aACF,OAAM,KAAK,QAAQ,IAAI,aAAa,eAAe,KAAK;AAE1D,SAAQ,aAAyB,EAAE,KAAiB;EAClD,MAAM,MAAM,KAAK,kBAAkB;AACnC,OAAK,MAAM,UAAU,KAAK,WAAW,KAAK,CACxC,cAAa,OAAO,MAAM,QAAQ,KAAK,KAAK,WAAW,IAAI;AAG7D,SAAO;;;AAIX,eAAe,KAAK,KAAc,MAA2B;AAC3D,OAAM,KAAK,KAAK,EAAE,OAAO,MAAM,CAAC;AAEhC,KAAI,CAAC,IAAK;CACV,MAAM,EAAE,cAAc,MAAM,OAAO;CACnC,MAAM,EAAE,YAAY,WAAW,KAAK,YAAY;CAChD,MAAM,qBAAqB,KAAK,QAAQ,WAAW;CACnD,IAAI;CAEJ,eAAe,YAAY;AACzB,MAAI,WAAW,CAAC,QAAQ,OACtB,OAAM,QAAQ,OAAO;AAGvB,YAAU,IAAI,UAAU;GACtB,eAAe;GACf,YAAY;GACZ,SAAS,CAAC,OAAO;GAClB,CAAC;AAEF,UAAQ,KAAK,eAAe;AAC1B,WAAQ,IAAI,oCAAoC;IAChD;AAEF,UAAQ,GAAG,QAAQ,QAAQ,SAAS;AAClC,OAAI,KAAK,QAAQ,KAAK,KAAK,oBAAoB;AAC7C,YAAQ,IAAI,uCAAuC;AACnD,aAAS,oBAAoB;AAC7B,KAAM,YAAY;AAChB,WAAM,KAAK,KAAK,EACd,QAAQ,WAAW,MAAM,KAAK,EAC/B,CAAC;AACF,WAAM,WAAW;AACjB,WAAM,KAAK,KAAK,EAAE,OAAO,MAAM,CAAC;QAC9B;;IAEN;AAEF,QAAM,KAAK,WAAW,EAAE,SAAS,CAAC;;AAGpC,SAAQ,GAAG,cAAc;AACvB,MAAI,CAAC,WAAW,QAAQ,OAAQ;AAChC,UAAQ,IAAI,oCAAoC;AAChD,EAAK,QAAQ,OAAO;GACpB;AAEF,OAAM,WAAW;;AAGnB,eAAsB,qBAAqB,SAAsB;CAC/D,MAAM,OAAO,eAAe,QAAQ;AACpC,OAAM,KAAK,KAAK,EACd,QAAQ,WAAW,MAAM,KAAK,EAC/B,CAAC;AACF,QAAO;;AAGT,SAAS,eAAe,EAAE,YAAY,KAAK,UAA6B;AACtE,QAAO,IAAI,KAAK;EACd;EACA;EACA;EACA,SAAS,CAAC,cAAc,CAAC;EAC1B,CAAC"}
|
package/dist/node/index.d.ts
CHANGED
package/dist/node/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/node/index.ts"],"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/node/index.ts"],"mappings":";;;;iBAGgB,QAAA,CAAS,OAAA,GAAS,aAAA"}
|
package/dist/node/loader.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","names":[],"sources":["../../src/node/loader.ts"],"
|
|
1
|
+
{"version":3,"file":"loader.d.ts","names":[],"sources":["../../src/node/loader.ts"],"mappings":";;;;KAQY,aAAA,GAAgB,IAAA,CAAK,WAAA;AAAA,cAEpB,UAAA,EAAY,cAAA,CAAe,aAAA;AAAA,cAU3B,IAAA,EAAM,QAAA"}
|
package/dist/node/loader.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as Core } from "../core-
|
|
3
|
-
import { t as createCache } from "../async-cache-
|
|
4
|
-
import {
|
|
1
|
+
import { createDynamicCore } from "../dynamic.js";
|
|
2
|
+
import { t as Core } from "../core-BuUsOElL.js";
|
|
3
|
+
import { t as createCache } from "../async-cache-DRmFaVGm.js";
|
|
4
|
+
import { loaderPlugin } from "../plugins/loader/index.js";
|
|
5
5
|
|
|
6
6
|
//#region src/node/loader.ts
|
|
7
7
|
let configLoader;
|
|
@@ -23,10 +23,10 @@ const load = async (url, context, nextLoad) => {
|
|
|
23
23
|
return plugin.node?.createLoad?.call(ctx);
|
|
24
24
|
}))).filter((v) => v !== void 0);
|
|
25
25
|
});
|
|
26
|
-
function run(i, url
|
|
27
|
-
if (i >= hooks.length) return nextLoad(url
|
|
28
|
-
return hooks[i](url
|
|
29
|
-
...context
|
|
26
|
+
function run(i, url, context) {
|
|
27
|
+
if (i >= hooks.length) return nextLoad(url, context);
|
|
28
|
+
return hooks[i](url, context, (url, ctx) => run(i + 1, url, {
|
|
29
|
+
...context,
|
|
30
30
|
...ctx
|
|
31
31
|
}));
|
|
32
32
|
}
|
package/dist/node/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","names":[
|
|
1
|
+
{"version":3,"file":"loader.js","names":[],"sources":["../../src/node/loader.ts"],"sourcesContent":["import { Core, CoreOptions } from \"@/core\";\nimport type { InitializeHook, LoadFnOutput, LoadHook, LoadHookContext } from \"node:module\";\nimport { createCache } from \"@/utils/async-cache\";\nimport { createDynamicCore, DynamicCore } from \"@/dynamic\";\nimport { loaderPlugin } from \"@/plugins/loader\";\n\nlet configLoader: DynamicCore | undefined;\n\nexport type LoaderOptions = Omit<CoreOptions, \"plugins\" | \"workspace\">;\n\nexport const initialize: InitializeHook<LoaderOptions> = (options) => {\n configLoader = createDynamicCore({\n core: new Core({\n ...options,\n plugins: [loaderPlugin()],\n }),\n mode: \"production\",\n });\n};\n\nexport const load: LoadHook = async (url, context, nextLoad) => {\n if (!configLoader) throw new Error(\"not initialized\");\n const core = await configLoader.getCore();\n const store = createCache(core.cache).$value<LoadHook[]>();\n\n const hooks = await store.cached(\"node:load-hooks\", async () => {\n const ctx = core.getPluginContext();\n\n const hooks = await Promise.all(\n core.getPlugins(true).map<Promise<LoadHook | undefined>>(async (plugin) => {\n return plugin.node?.createLoad?.call(ctx);\n }),\n );\n return hooks.filter((v) => v !== undefined);\n });\n\n function run(\n i: number,\n url: string,\n context: LoadHookContext,\n ): LoadFnOutput | Promise<LoadFnOutput> {\n if (i >= hooks.length) {\n return nextLoad(url, context);\n }\n\n return hooks[i](url, context, (url, ctx) => run(i + 1, url, { ...context, ...ctx }));\n }\n\n return run(0, url, context);\n};\n"],"mappings":";;;;;;AAMA,IAAI;AAIJ,MAAa,cAA6C,YAAY;AACpE,gBAAe,kBAAkB;EAC/B,MAAM,IAAI,KAAK;GACb,GAAG;GACH,SAAS,CAAC,cAAc,CAAC;GAC1B,CAAC;EACF,MAAM;EACP,CAAC;;AAGJ,MAAa,OAAiB,OAAO,KAAK,SAAS,aAAa;AAC9D,KAAI,CAAC,aAAc,OAAM,IAAI,MAAM,kBAAkB;CACrD,MAAM,OAAO,MAAM,aAAa,SAAS;CAGzC,MAAM,QAAQ,MAFA,YAAY,KAAK,MAAM,CAAC,QAAoB,CAEhC,OAAO,mBAAmB,YAAY;EAC9D,MAAM,MAAM,KAAK,kBAAkB;AAOnC,UALc,MAAM,QAAQ,IAC1B,KAAK,WAAW,KAAK,CAAC,IAAmC,OAAO,WAAW;AACzE,UAAO,OAAO,MAAM,YAAY,KAAK,IAAI;IACzC,CACH,EACY,QAAQ,MAAM,MAAM,OAAU;GAC3C;CAEF,SAAS,IACP,GACA,KACA,SACsC;AACtC,MAAI,KAAK,MAAM,OACb,QAAO,SAAS,KAAK,QAAQ;AAG/B,SAAO,MAAM,GAAG,KAAK,UAAU,KAAK,QAAQ,IAAI,IAAI,GAAG,KAAK;GAAE,GAAG;GAAS,GAAG;GAAK,CAAC,CAAC;;AAGtF,QAAO,IAAI,GAAG,KAAK,QAAQ"}
|
|
@@ -16,7 +16,7 @@ function toNode(loaders) {
|
|
|
16
16
|
return (await fs.readFile(filePath)).toString();
|
|
17
17
|
},
|
|
18
18
|
development: false,
|
|
19
|
-
|
|
19
|
+
addDependency() {}
|
|
20
20
|
});
|
|
21
21
|
if (result) return {
|
|
22
22
|
source: result.code,
|
|
@@ -30,4 +30,4 @@ function toNode(loaders) {
|
|
|
30
30
|
|
|
31
31
|
//#endregion
|
|
32
32
|
export { toNode };
|
|
33
|
-
//# sourceMappingURL=node-
|
|
33
|
+
//# sourceMappingURL=node-Cu5Pqxxo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-Cu5Pqxxo.js","names":[],"sources":["../src/plugins/loader/node.ts"],"sourcesContent":["import type { LoadFnOutput, LoadHook } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport fs from \"node:fs/promises\";\nimport type { Loader } from \"@/plugins/loader\";\n\nexport function toNode(loaders: { test: RegExp | undefined; loader: Loader }[]): LoadHook {\n return async (url, _context, nextLoad): Promise<LoadFnOutput> => {\n if (!url.startsWith(\"file:///\")) return nextLoad(url);\n\n const config = loaders.find((loader) => !loader.test || loader.test.test(url));\n if (config) {\n const parsedUrl = new URL(url);\n const filePath = fileURLToPath(parsedUrl);\n\n const result = await config.loader.load({\n filePath,\n query: Object.fromEntries(parsedUrl.searchParams.entries()),\n async getSource() {\n return (await fs.readFile(filePath)).toString();\n },\n development: false,\n addDependency() {},\n });\n\n if (result) {\n return {\n source: result.code,\n format: \"module\",\n shortCircuit: true,\n };\n }\n }\n\n return nextLoad(url);\n };\n}\n"],"mappings":";;;;AAKA,SAAgB,OAAO,SAAmE;AACxF,QAAO,OAAO,KAAK,UAAU,aAAoC;AAC/D,MAAI,CAAC,IAAI,WAAW,WAAW,CAAE,QAAO,SAAS,IAAI;EAErD,MAAM,SAAS,QAAQ,MAAM,WAAW,CAAC,OAAO,QAAQ,OAAO,KAAK,KAAK,IAAI,CAAC;AAC9E,MAAI,QAAQ;GACV,MAAM,YAAY,IAAI,IAAI,IAAI;GAC9B,MAAM,WAAW,cAAc,UAAU;GAEzC,MAAM,SAAS,MAAM,OAAO,OAAO,KAAK;IACtC;IACA,OAAO,OAAO,YAAY,UAAU,aAAa,SAAS,CAAC;IAC3D,MAAM,YAAY;AAChB,aAAQ,MAAM,GAAG,SAAS,SAAS,EAAE,UAAU;;IAEjD,aAAa;IACb,gBAAgB;IACjB,CAAC;AAEF,OAAI,OACF,QAAO;IACL,QAAQ,OAAO;IACf,QAAQ;IACR,cAAc;IACf;;AAIL,SAAO,SAAS,IAAI"}
|
|
@@ -54,39 +54,5 @@ function asyncPipe(steps = []) {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
//#endregion
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
pluginHooks = /* @__PURE__ */ new Map();
|
|
60
|
-
name = null;
|
|
61
|
-
/**
|
|
62
|
-
* on config loaded/updated
|
|
63
|
-
*/
|
|
64
|
-
onConfig = hook();
|
|
65
|
-
/**
|
|
66
|
-
* Configure watch/dev server
|
|
67
|
-
*/
|
|
68
|
-
onServer = hook();
|
|
69
|
-
onInit = asyncHook();
|
|
70
|
-
onEmit = asyncPipe();
|
|
71
|
-
plugins = [];
|
|
72
|
-
pluginHook(hook$1, options) {
|
|
73
|
-
let created = this.pluginHooks.get(hook$1.id);
|
|
74
|
-
if (created) return created;
|
|
75
|
-
created = hook$1.create(this, options);
|
|
76
|
-
this.pluginHooks.set(hook$1.id, created);
|
|
77
|
-
return created;
|
|
78
|
-
}
|
|
79
|
-
getPluginHook(hook$1) {
|
|
80
|
-
return this.pluginHooks.get(hook$1.id);
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
function defineCollectionHook(init) {
|
|
84
|
-
return {
|
|
85
|
-
id: Symbol(),
|
|
86
|
-
create: init
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
//#endregion
|
|
91
|
-
export { asyncHook as a, pipe as i, defineCollectionHook as n, hook as o, asyncPipe as r, Collection as t };
|
|
92
|
-
//# sourceMappingURL=collections-CNWuMDAZ.js.map
|
|
57
|
+
export { hook as i, pipe as n, asyncHook as r, asyncPipe as t };
|
|
58
|
+
//# sourceMappingURL=pipe-CvCqOpXX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipe-CvCqOpXX.js","names":[],"sources":["../src/utils/hook.ts","../src/utils/pipe.ts"],"sourcesContent":["import type { Awaitable } from \"@/types\";\n\nexport interface Hook<Context = undefined> {\n /**\n * add a hook\n *\n * @returns the same pipe instance\n */\n hook: (fn: (context: Context) => void) => Hook<Context>;\n run: (context: Context) => void;\n $inferHandler: (context: Context) => Awaitable<void>;\n}\n\nexport interface AsyncHook<Context = undefined> {\n /**\n * add a hook\n *\n * @returns the same pipe instance\n */\n hook: (fn: (context: Context) => Awaitable<void>) => AsyncHook<Context>;\n run: (context: Context) => Awaitable<void>;\n $inferHandler: (context: Context) => Awaitable<void>;\n}\n\nexport function hook<Context>(steps: ((ctx: Context) => void)[] = []): Hook<Context> {\n return {\n async run(ctx) {\n for (const step of steps) step(ctx);\n },\n hook(fn) {\n steps.push(fn);\n return this;\n },\n $inferHandler: undefined as never,\n };\n}\n\nexport function asyncHook<Context>(\n steps: ((ctx: Context) => Awaitable<void>)[] = [],\n): AsyncHook<Context> {\n return {\n async run(ctx) {\n await Promise.all(steps.map((step) => step(ctx)));\n },\n hook(fn) {\n steps.push(fn);\n return this;\n },\n $inferHandler: undefined as never,\n };\n}\n","import type { Awaitable } from \"@/types\";\n\nexport interface Pipe<Data, Context = undefined> {\n /**\n * add a transformation step\n *\n * @returns the same pipe instance\n */\n pipe: (fn: (data: Data, context: Context) => Data) => Pipe<Data, Context>;\n run: (data: Data, context: Context) => Data;\n $inferHandler: (data: Data, context: Context) => Data;\n}\n\nexport interface AsyncPipe<Data, Context = undefined> {\n /**\n * add a transformation step\n *\n * @returns the same pipe instance\n */\n pipe: (fn: (data: Data, context: Context) => Awaitable<Data>) => AsyncPipe<Data, Context>;\n run: (data: Data, context: Context) => Awaitable<Data>;\n $inferHandler: (data: Data, context: Context) => Awaitable<Data>;\n}\n\nexport function pipe<Data, Context>(\n steps: ((data: Data, context: Context) => Data)[] = [],\n): Pipe<Data, Context> {\n return {\n run(data, ctx) {\n for (const step of steps) {\n data = step(data, ctx);\n }\n return data;\n },\n pipe(fn) {\n steps.push(fn);\n return this;\n },\n $inferHandler: undefined as never,\n };\n}\n\nexport function asyncPipe<Data, Context>(\n steps: ((data: Data, context: Context) => Awaitable<Data>)[] = [],\n): AsyncPipe<Data, Context> {\n return {\n async run(data, ctx) {\n for (const step of steps) {\n data = await step(data, ctx);\n }\n return data;\n },\n pipe(fn) {\n steps.push(fn);\n return this;\n },\n $inferHandler: undefined as never,\n };\n}\n"],"mappings":";AAwBA,SAAgB,KAAc,QAAoC,EAAE,EAAiB;AACnF,QAAO;EACL,MAAM,IAAI,KAAK;AACb,QAAK,MAAM,QAAQ,MAAO,MAAK,IAAI;;EAErC,KAAK,IAAI;AACP,SAAM,KAAK,GAAG;AACd,UAAO;;EAET,eAAe;EAChB;;AAGH,SAAgB,UACd,QAA+C,EAAE,EAC7B;AACpB,QAAO;EACL,MAAM,IAAI,KAAK;AACb,SAAM,QAAQ,IAAI,MAAM,KAAK,SAAS,KAAK,IAAI,CAAC,CAAC;;EAEnD,KAAK,IAAI;AACP,SAAM,KAAK,GAAG;AACd,UAAO;;EAET,eAAe;EAChB;;;;;ACzBH,SAAgB,KACd,QAAoD,EAAE,EACjC;AACrB,QAAO;EACL,IAAI,MAAM,KAAK;AACb,QAAK,MAAM,QAAQ,MACjB,QAAO,KAAK,MAAM,IAAI;AAExB,UAAO;;EAET,KAAK,IAAI;AACP,SAAM,KAAK,GAAG;AACd,UAAO;;EAET,eAAe;EAChB;;AAGH,SAAgB,UACd,QAA+D,EAAE,EACvC;AAC1B,QAAO;EACL,MAAM,IAAI,MAAM,KAAK;AACnB,QAAK,MAAM,QAAQ,MACjB,QAAO,MAAM,KAAK,MAAM,IAAI;AAE9B,UAAO;;EAET,KAAK,IAAI;AACP,SAAM,KAAK,GAAG;AACd,UAAO;;EAET,eAAe;EAChB"}
|
package/dist/plugins/git.d.ts
CHANGED
|
@@ -1,3 +1,38 @@
|
|
|
1
|
-
import "../core-
|
|
2
|
-
import {
|
|
3
|
-
|
|
1
|
+
import { s as Plugin, v as AsyncHook } from "../core-FjA_Xoho.js";
|
|
2
|
+
import { CollectionHook } from "../collections/index.js";
|
|
3
|
+
|
|
4
|
+
//#region src/plugins/git.d.ts
|
|
5
|
+
interface GitFileData {
|
|
6
|
+
/**
|
|
7
|
+
* Last modified date of file, obtained from version control.
|
|
8
|
+
*/
|
|
9
|
+
lastModified: Date | null;
|
|
10
|
+
/**
|
|
11
|
+
* Creation date of file, obtained from version control.
|
|
12
|
+
*/
|
|
13
|
+
creationDate: Date | null;
|
|
14
|
+
}
|
|
15
|
+
interface GitHook {
|
|
16
|
+
/**
|
|
17
|
+
* receive the client.
|
|
18
|
+
*/
|
|
19
|
+
onClient: AsyncHook<{
|
|
20
|
+
client: GitClient;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
23
|
+
declare const gitHook: CollectionHook<GitHook, undefined>;
|
|
24
|
+
/**
|
|
25
|
+
* Add version control integration for Git.
|
|
26
|
+
* 1. Injects `creationDate` & `lastModified` properties to page exports.
|
|
27
|
+
*
|
|
28
|
+
* @remarks If you are using Vercel, please set `VERCEL_DEEP_CLONE` environment variable to `true`. This ensures the client can access the full commit history of Git.
|
|
29
|
+
*/
|
|
30
|
+
declare function git(): Plugin;
|
|
31
|
+
interface GitClient {
|
|
32
|
+
getFileData: (options: {
|
|
33
|
+
filePath: string;
|
|
34
|
+
}) => Promise<GitFileData>;
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { GitClient, GitFileData, GitHook, git as default, gitHook };
|
|
38
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","names":[],"sources":["../../src/plugins/git.ts"],"mappings":";;;;UAOiB,WAAA;;AAAjB;;EAIE,YAAA,EAAc,IAAA;EAII;;;EAAlB,YAAA,EAAc,IAAA;AAAA;AAAA,UAGC,OAAA;EAHG;AAGpB;;EAIE,QAAA,EAAU,SAAA;IAAY,MAAA,EAAQ,SAAA;EAAA;AAAA;AAAA,cAGnB,OAAA,EAAO,cAAA,CAAA,OAAA;;;;AAApB;;;iBAUwB,GAAA,CAAA,GAAO,MAAA;AAAA,UAed,SAAA;EACf,WAAA,GAAc,OAAA;IAAW,QAAA;EAAA,MAAuB,OAAA,CAAQ,WAAA;AAAA"}
|
package/dist/plugins/git.js
CHANGED
|
@@ -1,3 +1,61 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { r as asyncHook } from "../pipe-CvCqOpXX.js";
|
|
2
|
+
import { defineCollectionHook } from "../collections/index.js";
|
|
3
|
+
import { t as createCache } from "../async-cache-DRmFaVGm.js";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { x } from "tinyexec";
|
|
2
6
|
|
|
3
|
-
|
|
7
|
+
//#region src/plugins/git.ts
|
|
8
|
+
const gitHook = defineCollectionHook(() => ({ onClient: asyncHook() }));
|
|
9
|
+
/**
|
|
10
|
+
* Add version control integration for Git.
|
|
11
|
+
* 1. Injects `creationDate` & `lastModified` properties to page exports.
|
|
12
|
+
*
|
|
13
|
+
* @remarks If you are using Vercel, please set `VERCEL_DEEP_CLONE` environment variable to `true`. This ensures the client can access the full commit history of Git.
|
|
14
|
+
*/
|
|
15
|
+
function git() {
|
|
16
|
+
let client;
|
|
17
|
+
return {
|
|
18
|
+
name: "git",
|
|
19
|
+
config() {
|
|
20
|
+
const { cwd } = this.core.getOptions();
|
|
21
|
+
client = createGitClient(cwd);
|
|
22
|
+
},
|
|
23
|
+
async collection(collection) {
|
|
24
|
+
await collection.getPluginHook(gitHook)?.onClient.run({ client });
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function createGitClient(cwd) {
|
|
29
|
+
const cache = createCache();
|
|
30
|
+
function mapDate(out) {
|
|
31
|
+
if (out.exitCode !== 0) return null;
|
|
32
|
+
const date = new Date(out.stdout);
|
|
33
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
34
|
+
}
|
|
35
|
+
return { async getFileData({ filePath }) {
|
|
36
|
+
return cache.cached(filePath, async () => {
|
|
37
|
+
const relativePath = path.relative(cwd, filePath);
|
|
38
|
+
const [mod, create] = await Promise.all([x("git", [
|
|
39
|
+
"log",
|
|
40
|
+
"-1",
|
|
41
|
+
"--pretty=%ai",
|
|
42
|
+
relativePath
|
|
43
|
+
], { nodeOptions: { cwd } }), x("git", [
|
|
44
|
+
"log",
|
|
45
|
+
"--diff-filter=A",
|
|
46
|
+
"--follow",
|
|
47
|
+
"--format=%ai",
|
|
48
|
+
"-1",
|
|
49
|
+
relativePath
|
|
50
|
+
], { nodeOptions: { cwd } })]);
|
|
51
|
+
return {
|
|
52
|
+
lastModified: mapDate(mod),
|
|
53
|
+
creationDate: mapDate(create)
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
} };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
//#endregion
|
|
60
|
+
export { git as default, gitHook };
|
|
61
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","names":[],"sources":["../../src/plugins/git.ts"],"sourcesContent":["import path from \"node:path\";\nimport { type Output, x } from \"tinyexec\";\nimport type { Plugin } from \"@/core\";\nimport { createCache } from \"@/utils/async-cache\";\nimport { defineCollectionHook } from \"@/collections\";\nimport { asyncHook, AsyncHook } from \"@/utils/hook\";\n\nexport interface GitFileData {\n /**\n * Last modified date of file, obtained from version control.\n */\n lastModified: Date | null;\n /**\n * Creation date of file, obtained from version control.\n */\n creationDate: Date | null;\n}\n\nexport interface GitHook {\n /**\n * receive the client.\n */\n onClient: AsyncHook<{ client: GitClient }>;\n}\n\nexport const gitHook = defineCollectionHook<GitHook>(() => ({\n onClient: asyncHook(),\n}));\n\n/**\n * Add version control integration for Git.\n * 1. Injects `creationDate` & `lastModified` properties to page exports.\n *\n * @remarks If you are using Vercel, please set `VERCEL_DEEP_CLONE` environment variable to `true`. This ensures the client can access the full commit history of Git.\n */\nexport default function git(): Plugin {\n let client: GitClient;\n\n return {\n name: \"git\",\n config() {\n const { cwd } = this.core.getOptions();\n client = createGitClient(cwd);\n },\n async collection(collection) {\n await collection.getPluginHook(gitHook)?.onClient.run({ client });\n },\n };\n}\n\nexport interface GitClient {\n getFileData: (options: { filePath: string }) => Promise<GitFileData>;\n}\n\nfunction createGitClient(cwd: string): GitClient {\n const cache = createCache<GitFileData>();\n\n function mapDate(out: Output): Date | null {\n if (out.exitCode !== 0) return null;\n const date = new Date(out.stdout);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n\n return {\n async getFileData({ filePath }) {\n return cache.cached(filePath, async () => {\n const relativePath = path.relative(cwd, filePath);\n const [mod, create] = await Promise.all([\n x(\"git\", [\"log\", \"-1\", \"--pretty=%ai\", relativePath], {\n nodeOptions: {\n cwd,\n },\n }),\n x(\"git\", [\"log\", \"--diff-filter=A\", \"--follow\", \"--format=%ai\", \"-1\", relativePath], {\n nodeOptions: {\n cwd,\n },\n }),\n ]);\n\n return {\n lastModified: mapDate(mod),\n creationDate: mapDate(create),\n };\n });\n },\n };\n}\n"],"mappings":";;;;;;;AAyBA,MAAa,UAAU,4BAAqC,EAC1D,UAAU,WAAW,EACtB,EAAE;;;;;;;AAQH,SAAwB,MAAc;CACpC,IAAI;AAEJ,QAAO;EACL,MAAM;EACN,SAAS;GACP,MAAM,EAAE,QAAQ,KAAK,KAAK,YAAY;AACtC,YAAS,gBAAgB,IAAI;;EAE/B,MAAM,WAAW,YAAY;AAC3B,SAAM,WAAW,cAAc,QAAQ,EAAE,SAAS,IAAI,EAAE,QAAQ,CAAC;;EAEpE;;AAOH,SAAS,gBAAgB,KAAwB;CAC/C,MAAM,QAAQ,aAA0B;CAExC,SAAS,QAAQ,KAA0B;AACzC,MAAI,IAAI,aAAa,EAAG,QAAO;EAC/B,MAAM,OAAO,IAAI,KAAK,IAAI,OAAO;AACjC,SAAO,OAAO,MAAM,KAAK,SAAS,CAAC,GAAG,OAAO;;AAG/C,QAAO,EACL,MAAM,YAAY,EAAE,YAAY;AAC9B,SAAO,MAAM,OAAO,UAAU,YAAY;GACxC,MAAM,eAAe,KAAK,SAAS,KAAK,SAAS;GACjD,MAAM,CAAC,KAAK,UAAU,MAAM,QAAQ,IAAI,CACtC,EAAE,OAAO;IAAC;IAAO;IAAM;IAAgB;IAAa,EAAE,EACpD,aAAa,EACX,KACD,EACF,CAAC,EACF,EAAE,OAAO;IAAC;IAAO;IAAmB;IAAY;IAAgB;IAAM;IAAa,EAAE,EACnF,aAAa,EACX,KACD,EACF,CAAC,CACH,CAAC;AAEF,UAAO;IACL,cAAc,QAAQ,IAAI;IAC1B,cAAc,QAAQ,OAAO;IAC9B;IACD;IAEL"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema.d.ts","names":[],"sources":["../../src/plugins/json-schema.ts"],"
|
|
1
|
+
{"version":3,"file":"json-schema.d.ts","names":[],"sources":["../../src/plugins/json-schema.ts"],"mappings":";;;;UAMiB,iBAAA;;;AAAjB;;;EAME,MAAA;EAAA;;;EAKA,MAAA,SAAe,SAAA;AAAA;AAAA,UAGA,cAAA;EACf,aAAA;EACA,MAAA,SAAe,SAAA;AAAA;;;;cAMJ,cAAA,EAAc,cAAA,CAAA,cAAA,EAAA,iBAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { defineCollectionHook } from "../collections/index.js";
|
|
2
|
+
import { FileSystemCollection } from "../collections/fs.js";
|
|
3
3
|
import fs from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema.js","names":[
|
|
1
|
+
{"version":3,"file":"json-schema.js","names":[],"sources":["../../src/plugins/json-schema.ts"],"sourcesContent":["import { defineCollectionHook } from \"@/collections\";\nimport { FileSystemCollection } from \"@/collections/fs\";\nimport { Awaitable } from \"@/types\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport interface JSONSchemaOptions {\n /**\n * insert `$schema` field to JSON files on creation.\n *\n * @defaultValue false\n */\n insert?: boolean;\n\n /**\n * create JSON schema\n */\n create?: () => Awaitable<object | undefined>;\n}\n\nexport interface JSONSchemaHook {\n getSchemaPath: () => string;\n create?: () => Awaitable<object | undefined>;\n}\n\n/**\n * Generate JSON schemas locally for collection schemas.\n */\nexport const jsonSchemaHook = defineCollectionHook<JSONSchemaHook, JSONSchemaOptions>(\n (collection, { insert = false, create }) => {\n const hook: JSONSchemaHook = {\n create,\n getSchemaPath() {\n return `json-schema/${collection.name}.json`;\n },\n };\n\n collection.onServer.hook(({ core, server }) => {\n const { outDir } = core.getOptions();\n if (!server.watcher || !insert || !(collection instanceof FileSystemCollection)) return;\n\n server.watcher.on(\"add\", async (file) => {\n if (!collection.hasFile(file) || !file.endsWith(\".json\")) return;\n\n let obj: object;\n try {\n const content = (await fs.readFile(file)).toString();\n obj = content.length > 0 ? JSON.parse(content) : {};\n } catch {\n return;\n }\n\n if (\"$schema\" in obj) return;\n const schemaPath = path.join(outDir, hook.getSchemaPath());\n const updated = {\n $schema: path.relative(path.dirname(file), schemaPath),\n ...obj,\n };\n\n await fs.writeFile(file, JSON.stringify(updated, null, 2));\n });\n });\n collection.onEmit.pipe(async (entries) => {\n const jsonSchema = await hook.create?.();\n if (!jsonSchema) return entries;\n entries.push({\n path: hook.getSchemaPath(),\n content: JSON.stringify(jsonSchema, null, 2),\n });\n return entries;\n });\n return hook;\n },\n);\n"],"mappings":";;;;;;;;;AA4BA,MAAa,iBAAiB,sBAC3B,YAAY,EAAE,SAAS,OAAO,aAAa;CAC1C,MAAM,OAAuB;EAC3B;EACA,gBAAgB;AACd,UAAO,eAAe,WAAW,KAAK;;EAEzC;AAED,YAAW,SAAS,MAAM,EAAE,MAAM,aAAa;EAC7C,MAAM,EAAE,WAAW,KAAK,YAAY;AACpC,MAAI,CAAC,OAAO,WAAW,CAAC,UAAU,EAAE,sBAAsB,sBAAuB;AAEjF,SAAO,QAAQ,GAAG,OAAO,OAAO,SAAS;AACvC,OAAI,CAAC,WAAW,QAAQ,KAAK,IAAI,CAAC,KAAK,SAAS,QAAQ,CAAE;GAE1D,IAAI;AACJ,OAAI;IACF,MAAM,WAAW,MAAM,GAAG,SAAS,KAAK,EAAE,UAAU;AACpD,UAAM,QAAQ,SAAS,IAAI,KAAK,MAAM,QAAQ,GAAG,EAAE;WAC7C;AACN;;AAGF,OAAI,aAAa,IAAK;GACtB,MAAM,aAAa,KAAK,KAAK,QAAQ,KAAK,eAAe,CAAC;GAC1D,MAAM,UAAU;IACd,SAAS,KAAK,SAAS,KAAK,QAAQ,KAAK,EAAE,WAAW;IACtD,GAAG;IACJ;AAED,SAAM,GAAG,UAAU,MAAM,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC;IAC1D;GACF;AACF,YAAW,OAAO,KAAK,OAAO,YAAY;EACxC,MAAM,aAAa,MAAM,KAAK,UAAU;AACxC,MAAI,CAAC,WAAY,QAAO;AACxB,UAAQ,KAAK;GACX,MAAM,KAAK,eAAe;GAC1B,SAAS,KAAK,UAAU,YAAY,MAAM,EAAE;GAC7C,CAAC;AACF,SAAO;GACP;AACF,QAAO;EAEV"}
|
|
@@ -1,4 +1,72 @@
|
|
|
1
|
-
import "../../core-
|
|
2
|
-
import "../../
|
|
3
|
-
import
|
|
4
|
-
|
|
1
|
+
import { c as PluginContext, s as Plugin } from "../../core-FjA_Xoho.js";
|
|
2
|
+
import { CollectionHook } from "../../collections/index.js";
|
|
3
|
+
import "../../load-from-file-CIYdu-B5.js";
|
|
4
|
+
import { WebpackLoaderOptions } from "./webpack.js";
|
|
5
|
+
import { NextConfig } from "next";
|
|
6
|
+
|
|
7
|
+
//#region src/plugins/loader/index.d.ts
|
|
8
|
+
type Awaitable<T> = T | Promise<T>;
|
|
9
|
+
type LoaderEnvironment = "vite" | "bun" | "node";
|
|
10
|
+
interface Loader {
|
|
11
|
+
/**
|
|
12
|
+
* Transform input into JavaScript.
|
|
13
|
+
*
|
|
14
|
+
* Returns:
|
|
15
|
+
* - `LoaderOutput`: JavaScript code & source map.
|
|
16
|
+
* - `null`: skip the loader. Fallback to default behaviour if possible, otherwise the adapter will try workarounds.
|
|
17
|
+
*/
|
|
18
|
+
load: (input: LoaderInput) => Awaitable<LoaderOutput | null>;
|
|
19
|
+
bun?: {
|
|
20
|
+
/**
|
|
21
|
+
* 1. Bun doesn't allow `null` in loaders.
|
|
22
|
+
* 2. Bun requires sync result to support dynamic require().
|
|
23
|
+
*/
|
|
24
|
+
load?: (source: string, input: LoaderInput) => Awaitable<Bun.OnLoadResult>;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
interface LoaderInput {
|
|
28
|
+
development: boolean;
|
|
29
|
+
filePath: string;
|
|
30
|
+
query: Record<string, string | string[] | undefined>;
|
|
31
|
+
getSource: () => string | Promise<string>;
|
|
32
|
+
addDependency: (file: string) => void;
|
|
33
|
+
}
|
|
34
|
+
interface LoaderOutput {
|
|
35
|
+
code: string;
|
|
36
|
+
map?: unknown;
|
|
37
|
+
/**
|
|
38
|
+
* only supported on Vite 8 at the moment, specify the output module type.
|
|
39
|
+
*
|
|
40
|
+
* on unsupported environments, it will be ignored.
|
|
41
|
+
*/
|
|
42
|
+
moduleType?: "js" | "json";
|
|
43
|
+
}
|
|
44
|
+
interface NextLoaderContext extends PluginContext {
|
|
45
|
+
getLoaderOptions: () => WebpackLoaderOptions;
|
|
46
|
+
}
|
|
47
|
+
interface LoaderConfig {
|
|
48
|
+
/** unique ID for loader, used to deduplicate loaders */
|
|
49
|
+
id?: string;
|
|
50
|
+
/**
|
|
51
|
+
* Filter file paths, the input can be either a file URL or file path.
|
|
52
|
+
*
|
|
53
|
+
* Must take resource query into consideration.
|
|
54
|
+
*/
|
|
55
|
+
test?: RegExp;
|
|
56
|
+
/**
|
|
57
|
+
* @remarks it doesn't configure automatically for Next.js, you have to define the webpack/turbopack config in `configureNext()`.
|
|
58
|
+
*/
|
|
59
|
+
createLoader: (this: PluginContext, environment: LoaderEnvironment) => Promise<Loader>;
|
|
60
|
+
configureNext?: (this: NextLoaderContext, next: NextConfig) => NextConfig;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* a light layer for implementing loaders.
|
|
64
|
+
*/
|
|
65
|
+
declare function loaderPlugin(): Plugin;
|
|
66
|
+
interface LoaderHook {
|
|
67
|
+
loaders: LoaderConfig[];
|
|
68
|
+
}
|
|
69
|
+
declare const loaderHook: CollectionHook<LoaderHook, undefined>;
|
|
70
|
+
//#endregion
|
|
71
|
+
export { Loader, LoaderConfig, LoaderHook, LoaderInput, LoaderOutput, loaderHook, loaderPlugin };
|
|
72
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/plugins/loader/index.ts"],"mappings":";;;;;;;KAOK,SAAA,MAAe,CAAA,GAAI,OAAA,CAAQ,CAAA;AAAA,KAE3B,iBAAA;AAAA,UAEY,MAAA;;AAPmC;;;;;;EAelD,IAAA,GAAO,KAAA,EAAO,WAAA,KAAgB,SAAA,CAAU,YAAA;EAExC,GAAA;IAda;;;;IAmBX,IAAA,IAAQ,MAAA,UAAgB,KAAA,EAAO,WAAA,KAAgB,SAAA,CAAU,GAAA,CAAI,YAAA;EAAA;AAAA;AAAA,UAIhD,WAAA;EACf,WAAA;EAEA,QAAA;EACA,KAAA,EAAO,MAAA;EACP,SAAA,iBAA0B,OAAA;EAC1B,aAAA,GAAgB,IAAA;AAAA;AAAA,UAGD,YAAA;EACf,IAAA;EACA,GAAA;EAfiC;;;;;EAsBjC,UAAA;AAAA;AAAA,UAGQ,iBAAA,SAA0B,aAAA;EAClC,gBAAA,QAAwB,oBAAA;AAAA;AAAA,UAGT,YAAA;EA7Bb;EA+BF,EAAA;EA/BiC;;;;;EAsCjC,IAAA,GAAO,MAAA;EAtCoE;AAI7E;;EAuCE,YAAA,GAAe,IAAA,EAAM,aAAA,EAAe,WAAA,EAAa,iBAAA,KAAsB,OAAA,CAAQ,MAAA;EAC/E,aAAA,IAAiB,IAAA,EAAM,iBAAA,EAAmB,IAAA,EAAM,UAAA,KAAe,UAAA;AAAA;;;;iBAYjD,YAAA,CAAA,GAAgB,MAAA;AAAA,UAsFf,UAAA;EACf,OAAA,EAAS,YAAA;AAAA;AAAA,cAGE,UAAA,EAAU,cAAA,CAAA,UAAA"}
|
|
@@ -1,3 +1,78 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { defineCollectionHook } from "../../collections/index.js";
|
|
2
|
+
import { t as createCache } from "../../async-cache-DRmFaVGm.js";
|
|
3
|
+
import path from "node:path";
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
//#region src/plugins/loader/index.ts
|
|
6
|
+
/**
|
|
7
|
+
* a light layer for implementing loaders.
|
|
8
|
+
*/
|
|
9
|
+
function loaderPlugin() {
|
|
10
|
+
const cachedLoaders = createCache();
|
|
11
|
+
function initLoaders(ctx, env) {
|
|
12
|
+
const { core } = ctx;
|
|
13
|
+
return cachedLoaders.cached(env, async () => {
|
|
14
|
+
const usedIds = /* @__PURE__ */ new Set();
|
|
15
|
+
const out = [];
|
|
16
|
+
for (const collection of core.getCollections()) {
|
|
17
|
+
const hook = collection.getPluginHook(loaderHook);
|
|
18
|
+
if (!hook) continue;
|
|
19
|
+
let nextId = 0;
|
|
20
|
+
for (const loader of hook.loaders) {
|
|
21
|
+
if (loader.id && usedIds.has(loader.id)) continue;
|
|
22
|
+
if (loader.id) usedIds.add(loader.id);
|
|
23
|
+
out.push({
|
|
24
|
+
id: loader.id ?? `${collection.name}:${nextId++}`,
|
|
25
|
+
test: loader.test,
|
|
26
|
+
loader: await loader.createLoader.call(ctx, env)
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
name: "fuma-content:loader",
|
|
35
|
+
next: { config(config) {
|
|
36
|
+
const ctx = {
|
|
37
|
+
...this,
|
|
38
|
+
getLoaderOptions: () => {
|
|
39
|
+
const { configPath, outDir } = this.core.getOptions();
|
|
40
|
+
return {
|
|
41
|
+
configPath,
|
|
42
|
+
outDir,
|
|
43
|
+
absoluteCompiledConfigPath: path.resolve(this.core.getCompiledConfigPath()),
|
|
44
|
+
isDev: process.env.NODE_ENV === "development"
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
for (const collection of this.core.getCollections()) {
|
|
49
|
+
const hook = collection.getPluginHook(loaderHook);
|
|
50
|
+
if (!hook) continue;
|
|
51
|
+
for (const loader of hook.loaders) {
|
|
52
|
+
if (!loader.configureNext) continue;
|
|
53
|
+
config = loader.configureNext.call(ctx, config);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return config;
|
|
57
|
+
} },
|
|
58
|
+
bun: { async setup(build) {
|
|
59
|
+
const { toBun } = await import("../../bun-Be5pgXW_.js");
|
|
60
|
+
for (const loader of await initLoaders(this, "bun")) toBun(loader.test, loader.loader)(build);
|
|
61
|
+
} },
|
|
62
|
+
node: { async createLoad() {
|
|
63
|
+
const { toNode } = await import("../../node-Cu5Pqxxo.js");
|
|
64
|
+
return toNode(await initLoaders(this, "node"));
|
|
65
|
+
} },
|
|
66
|
+
vite: { async createPlugin() {
|
|
67
|
+
const { toVite } = await import("../../vite-CoJIMNWk.js");
|
|
68
|
+
return (await initLoaders(this, "vite")).map((loader) => {
|
|
69
|
+
return toVite(`fuma-content:${loader.id}`, loader.test, loader.loader);
|
|
70
|
+
});
|
|
71
|
+
} }
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const loaderHook = defineCollectionHook(() => ({ loaders: [] }));
|
|
75
|
+
|
|
76
|
+
//#endregion
|
|
77
|
+
export { loaderHook, loaderPlugin };
|
|
78
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/plugins/loader/index.ts"],"sourcesContent":["import { defineCollectionHook } from \"@/collections\";\nimport type { Plugin, PluginContext } from \"@/core\";\nimport { createCache } from \"@/utils/async-cache\";\nimport { NextConfig } from \"next\";\nimport { WebpackLoaderOptions } from \"./webpack.js\";\nimport path from \"node:path\";\n\ntype Awaitable<T> = T | Promise<T>;\n\ntype LoaderEnvironment = \"vite\" | \"bun\" | \"node\";\n\nexport interface Loader {\n /**\n * Transform input into JavaScript.\n *\n * Returns:\n * - `LoaderOutput`: JavaScript code & source map.\n * - `null`: skip the loader. Fallback to default behaviour if possible, otherwise the adapter will try workarounds.\n */\n load: (input: LoaderInput) => Awaitable<LoaderOutput | null>;\n\n bun?: {\n /**\n * 1. Bun doesn't allow `null` in loaders.\n * 2. Bun requires sync result to support dynamic require().\n */\n load?: (source: string, input: LoaderInput) => Awaitable<Bun.OnLoadResult>;\n };\n}\n\nexport interface LoaderInput {\n development: boolean;\n\n filePath: string;\n query: Record<string, string | string[] | undefined>;\n getSource: () => string | Promise<string>;\n addDependency: (file: string) => void;\n}\n\nexport interface LoaderOutput {\n code: string;\n map?: unknown;\n\n /**\n * only supported on Vite 8 at the moment, specify the output module type.\n *\n * on unsupported environments, it will be ignored.\n */\n moduleType?: \"js\" | \"json\";\n}\n\ninterface NextLoaderContext extends PluginContext {\n getLoaderOptions: () => WebpackLoaderOptions;\n}\n\nexport interface LoaderConfig {\n /** unique ID for loader, used to deduplicate loaders */\n id?: string;\n\n /**\n * Filter file paths, the input can be either a file URL or file path.\n *\n * Must take resource query into consideration.\n */\n test?: RegExp;\n\n /**\n * @remarks it doesn't configure automatically for Next.js, you have to define the webpack/turbopack config in `configureNext()`.\n */\n createLoader: (this: PluginContext, environment: LoaderEnvironment) => Promise<Loader>;\n configureNext?: (this: NextLoaderContext, next: NextConfig) => NextConfig;\n}\n\ninterface ResolvedLoader {\n id: string;\n test: RegExp | undefined;\n loader: Loader;\n}\n\n/**\n * a light layer for implementing loaders.\n */\nexport function loaderPlugin(): Plugin {\n // env -> loaders\n const cachedLoaders = createCache<ResolvedLoader[]>();\n\n function initLoaders(ctx: PluginContext, env: LoaderEnvironment) {\n const { core } = ctx;\n return cachedLoaders.cached(env, async () => {\n const usedIds = new Set<string>();\n const out: ResolvedLoader[] = [];\n\n for (const collection of core.getCollections()) {\n const hook = collection.getPluginHook(loaderHook);\n if (!hook) continue;\n\n let nextId = 0;\n for (const loader of hook.loaders) {\n if (loader.id && usedIds.has(loader.id)) continue;\n if (loader.id) usedIds.add(loader.id);\n\n out.push({\n id: loader.id ?? `${collection.name}:${nextId++}`,\n test: loader.test,\n loader: await loader.createLoader.call(ctx, env),\n });\n }\n }\n return out;\n });\n }\n\n return {\n name: \"fuma-content:loader\",\n next: {\n config(config) {\n const ctx: NextLoaderContext = {\n ...this,\n getLoaderOptions: () => {\n const { configPath, outDir } = this.core.getOptions();\n return {\n configPath,\n outDir,\n absoluteCompiledConfigPath: path.resolve(this.core.getCompiledConfigPath()),\n isDev: process.env.NODE_ENV === \"development\",\n };\n },\n };\n for (const collection of this.core.getCollections()) {\n const hook = collection.getPluginHook(loaderHook);\n if (!hook) continue;\n\n for (const loader of hook.loaders) {\n if (!loader.configureNext) continue;\n\n config = loader.configureNext.call(ctx, config);\n }\n }\n\n return config;\n },\n },\n bun: {\n async setup(build) {\n const { toBun } = await import(\"./bun\");\n\n for (const loader of await initLoaders(this, \"bun\")) {\n toBun(loader.test, loader.loader)(build);\n }\n },\n },\n node: {\n async createLoad() {\n const { toNode } = await import(\"./node\");\n return toNode(await initLoaders(this, \"node\"));\n },\n },\n vite: {\n async createPlugin() {\n const { toVite } = await import(\"./vite\");\n return (await initLoaders(this, \"vite\")).map((loader) => {\n return toVite(`fuma-content:${loader.id}`, loader.test, loader.loader);\n });\n },\n },\n };\n}\n\nexport interface LoaderHook {\n loaders: LoaderConfig[];\n}\n\nexport const loaderHook = defineCollectionHook<LoaderHook>(() => ({\n loaders: [],\n}));\n"],"mappings":";;;;;;;;AAkFA,SAAgB,eAAuB;CAErC,MAAM,gBAAgB,aAA+B;CAErD,SAAS,YAAY,KAAoB,KAAwB;EAC/D,MAAM,EAAE,SAAS;AACjB,SAAO,cAAc,OAAO,KAAK,YAAY;GAC3C,MAAM,0BAAU,IAAI,KAAa;GACjC,MAAM,MAAwB,EAAE;AAEhC,QAAK,MAAM,cAAc,KAAK,gBAAgB,EAAE;IAC9C,MAAM,OAAO,WAAW,cAAc,WAAW;AACjD,QAAI,CAAC,KAAM;IAEX,IAAI,SAAS;AACb,SAAK,MAAM,UAAU,KAAK,SAAS;AACjC,SAAI,OAAO,MAAM,QAAQ,IAAI,OAAO,GAAG,CAAE;AACzC,SAAI,OAAO,GAAI,SAAQ,IAAI,OAAO,GAAG;AAErC,SAAI,KAAK;MACP,IAAI,OAAO,MAAM,GAAG,WAAW,KAAK,GAAG;MACvC,MAAM,OAAO;MACb,QAAQ,MAAM,OAAO,aAAa,KAAK,KAAK,IAAI;MACjD,CAAC;;;AAGN,UAAO;IACP;;AAGJ,QAAO;EACL,MAAM;EACN,MAAM,EACJ,OAAO,QAAQ;GACb,MAAM,MAAyB;IAC7B,GAAG;IACH,wBAAwB;KACtB,MAAM,EAAE,YAAY,WAAW,KAAK,KAAK,YAAY;AACrD,YAAO;MACL;MACA;MACA,4BAA4B,KAAK,QAAQ,KAAK,KAAK,uBAAuB,CAAC;MAC3E,OAAO,QAAQ,IAAI,aAAa;MACjC;;IAEJ;AACD,QAAK,MAAM,cAAc,KAAK,KAAK,gBAAgB,EAAE;IACnD,MAAM,OAAO,WAAW,cAAc,WAAW;AACjD,QAAI,CAAC,KAAM;AAEX,SAAK,MAAM,UAAU,KAAK,SAAS;AACjC,SAAI,CAAC,OAAO,cAAe;AAE3B,cAAS,OAAO,cAAc,KAAK,KAAK,OAAO;;;AAInD,UAAO;KAEV;EACD,KAAK,EACH,MAAM,MAAM,OAAO;GACjB,MAAM,EAAE,UAAU,MAAM,OAAO;AAE/B,QAAK,MAAM,UAAU,MAAM,YAAY,MAAM,MAAM,CACjD,OAAM,OAAO,MAAM,OAAO,OAAO,CAAC,MAAM;KAG7C;EACD,MAAM,EACJ,MAAM,aAAa;GACjB,MAAM,EAAE,WAAW,MAAM,OAAO;AAChC,UAAO,OAAO,MAAM,YAAY,MAAM,OAAO,CAAC;KAEjD;EACD,MAAM,EACJ,MAAM,eAAe;GACnB,MAAM,EAAE,WAAW,MAAM,OAAO;AAChC,WAAQ,MAAM,YAAY,MAAM,OAAO,EAAE,KAAK,WAAW;AACvD,WAAO,OAAO,gBAAgB,OAAO,MAAM,OAAO,MAAM,OAAO,OAAO;KACtE;KAEL;EACF;;AAOH,MAAa,aAAa,4BAAwC,EAChE,SAAS,EAAE,EACZ,EAAE"}
|
|
@@ -1,4 +1,21 @@
|
|
|
1
|
-
import "../../core-
|
|
2
|
-
import "../../
|
|
3
|
-
import {
|
|
4
|
-
|
|
1
|
+
import "../../core-FjA_Xoho.js";
|
|
2
|
+
import "../../load-from-file-CIYdu-B5.js";
|
|
3
|
+
import { DynamicCore } from "../../dynamic.js";
|
|
4
|
+
import { Loader } from "./index.js";
|
|
5
|
+
import { LoaderContext } from "webpack";
|
|
6
|
+
|
|
7
|
+
//#region src/plugins/loader/webpack.d.ts
|
|
8
|
+
interface WebpackLoaderOptions {
|
|
9
|
+
absoluteCompiledConfigPath: string;
|
|
10
|
+
configPath: string;
|
|
11
|
+
outDir: string;
|
|
12
|
+
isDev: boolean;
|
|
13
|
+
}
|
|
14
|
+
type WebpackLoader = (this: LoaderContext<WebpackLoaderOptions>, source: string) => void;
|
|
15
|
+
/**
|
|
16
|
+
* Note: need to handle the `test` regex in Webpack config instead.
|
|
17
|
+
*/
|
|
18
|
+
declare function createWebpackLoader(loaderFactory: (core: DynamicCore) => Loader): WebpackLoader;
|
|
19
|
+
//#endregion
|
|
20
|
+
export { WebpackLoader, WebpackLoaderOptions, createWebpackLoader };
|
|
21
|
+
//# sourceMappingURL=webpack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webpack.d.ts","names":[],"sources":["../../../src/plugins/loader/webpack.ts"],"mappings":";;;;;;;UAQiB,oBAAA;EACf,0BAAA;EACA,UAAA;EACA,MAAA;EACA,KAAA;AAAA;AAAA,KAGU,aAAA,IAAiB,IAAA,EAAM,aAAA,CAAc,oBAAA,GAAuB,MAAA;;;;iBAqBxD,mBAAA,CAAoB,aAAA,GAAgB,IAAA,EAAM,WAAA,KAAgB,MAAA,GAAS,aAAA"}
|