nuxt-files-sdk 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +17 -2
  2. package/dist/config.d.ts +15 -1
  3. package/dist/config.js +2 -1
  4. package/dist/config.js.map +1 -1
  5. package/dist/devtools/client/app.js +6 -0
  6. package/dist/devtools/client/index.html +389 -72
  7. package/dist/devtools/devframe.js +60 -7
  8. package/dist/devtools/devframe.js.map +1 -1
  9. package/dist/devtools/diagnostics.d.ts +37 -0
  10. package/dist/devtools/diagnostics.js +39 -0
  11. package/dist/devtools/diagnostics.js.map +1 -0
  12. package/dist/devtools/enabled.d.ts +9 -0
  13. package/dist/devtools/enabled.js +3 -2
  14. package/dist/devtools/enabled.js.map +1 -1
  15. package/dist/devtools/files-read.d.ts +5 -0
  16. package/dist/devtools/files-read.js +7 -0
  17. package/dist/devtools/files-read.js.map +1 -0
  18. package/dist/devtools/files-write.d.ts +5 -0
  19. package/dist/devtools/files-write.js +7 -0
  20. package/dist/devtools/files-write.js.map +1 -0
  21. package/dist/devtools/files.js +48 -0
  22. package/dist/devtools/files.js.map +1 -0
  23. package/dist/devtools/index.js +10 -3
  24. package/dist/devtools/index.js.map +1 -1
  25. package/dist/devtools/nuxt-v3-handler.js +16 -4
  26. package/dist/devtools/nuxt-v3-handler.js.map +1 -1
  27. package/dist/devtools/nuxt-v4.js +37 -6
  28. package/dist/devtools/nuxt-v4.js.map +1 -1
  29. package/dist/devtools/snapshot.d.ts +4 -5
  30. package/dist/devtools/snapshot.js +3 -1
  31. package/dist/devtools/snapshot.js.map +1 -1
  32. package/dist/integration/nitro.d.ts +6 -1
  33. package/dist/integration/nitro.js +38 -14
  34. package/dist/integration/nitro.js.map +1 -1
  35. package/dist/module.d.ts +4 -3
  36. package/dist/module.js +15 -3
  37. package/dist/module.js.map +1 -1
  38. package/dist/package.js +1 -1
  39. package/dist/runtime/registry.d.ts +4 -4
  40. package/dist/runtime/registry.js +46 -15
  41. package/dist/runtime/registry.js.map +1 -1
  42. package/dist/runtime.js +13 -8
  43. package/dist/runtime.js.map +1 -1
  44. package/package.json +7 -12
  45. package/dist/plugins/versioning.d.ts +0 -3
  46. package/dist/plugins/versioning.js +0 -2
  47. package/dist/plugins.d.ts +0 -31
  48. package/dist/plugins.js +0 -16
@@ -0,0 +1,39 @@
1
+ //#region src/devtools/diagnostics.ts
2
+ const troubleshooting = "https://github.com/liria24/nuxt-files-sdk/blob/main/docs/content/4.reference/4.troubleshooting.md";
3
+ const FILES_DEVTOOLS_DIAGNOSTICS = {
4
+ NUXT_FILES_NOT_CONFIGURED: {
5
+ level: "warning",
6
+ message: "The Files registry has not been configured.",
7
+ hint: "Check that files.config.ts is loaded by the Nuxt or Nitro integration.",
8
+ docs: troubleshooting
9
+ },
10
+ NUXT_FILES_INVALID_CONFIG: {
11
+ level: "error",
12
+ message: "The Files registry rejected the storage configuration.",
13
+ hint: "Check the storage and devStorage shapes in files.config.ts.",
14
+ docs: troubleshooting
15
+ },
16
+ NUXT_FILES_ADAPTER_INIT_FAILED: {
17
+ level: "error",
18
+ message: "A configured storage adapter could not be initialized.",
19
+ hint: "Check the provider package, runtime support, and required configuration.",
20
+ docs: troubleshooting
21
+ },
22
+ NUXT_FILES_GATEWAY_FAILED: {
23
+ level: "error",
24
+ message: "The Files DevTools gateway could not complete a request.",
25
+ hint: "Check the Nitro development server and the Files registry diagnostics.",
26
+ docs: troubleshooting
27
+ }
28
+ };
29
+ const createFilesDevtoolsDiagnostic = (code, message) => ({
30
+ code,
31
+ ...FILES_DEVTOOLS_DIAGNOSTICS[code],
32
+ ...message ? { message } : {}
33
+ });
34
+ const isFilesDevtoolsDiagnostic = (value) => Boolean(value && typeof value === "object" && "code" in value && typeof value.code === "string" && Object.hasOwn(FILES_DEVTOOLS_DIAGNOSTICS, value.code) && "level" in value && (value.level === "info" || value.level === "warning" || value.level === "error") && "message" in value && typeof value.message === "string");
35
+ const isFilesDevtoolsFailure = (value) => Boolean(value && typeof value === "object" && "kind" in value && (value.kind === "upload" || value.kind === "delete" || value.kind === "initialization" || value.kind === "gateway") && "message" in value && typeof value.message === "string" && (!("target" in value) || value.target === void 0 || typeof value.target === "string"));
36
+ //#endregion
37
+ export { FILES_DEVTOOLS_DIAGNOSTICS, createFilesDevtoolsDiagnostic, isFilesDevtoolsDiagnostic, isFilesDevtoolsFailure };
38
+
39
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","names":[],"sources":["../../src/devtools/diagnostics.ts"],"sourcesContent":["const troubleshooting =\n 'https://github.com/liria24/nuxt-files-sdk/blob/main/docs/content/4.reference/4.troubleshooting.md'\n\nexport interface FilesDevtoolsDiagnostic {\n code: FilesDevtoolsDiagnosticCode\n level: 'info' | 'warning' | 'error'\n message: string\n hint?: string\n docs?: string\n}\n\nexport const FILES_DEVTOOLS_DIAGNOSTICS = {\n NUXT_FILES_NOT_CONFIGURED: {\n level: 'warning',\n message: 'The Files registry has not been configured.',\n hint: 'Check that files.config.ts is loaded by the Nuxt or Nitro integration.',\n docs: troubleshooting,\n },\n NUXT_FILES_INVALID_CONFIG: {\n level: 'error',\n message: 'The Files registry rejected the storage configuration.',\n hint: 'Check the storage and devStorage shapes in files.config.ts.',\n docs: troubleshooting,\n },\n NUXT_FILES_ADAPTER_INIT_FAILED: {\n level: 'error',\n message: 'A configured storage adapter could not be initialized.',\n hint: 'Check the provider package, runtime support, and required configuration.',\n docs: troubleshooting,\n },\n NUXT_FILES_GATEWAY_FAILED: {\n level: 'error',\n message: 'The Files DevTools gateway could not complete a request.',\n hint: 'Check the Nitro development server and the Files registry diagnostics.',\n docs: troubleshooting,\n },\n} as const satisfies Record<string, Omit<FilesDevtoolsDiagnostic, 'code'>>\n\nexport type FilesDevtoolsDiagnosticCode = keyof typeof FILES_DEVTOOLS_DIAGNOSTICS\n\nexport const createFilesDevtoolsDiagnostic = (\n code: FilesDevtoolsDiagnosticCode,\n message?: string,\n): FilesDevtoolsDiagnostic => ({ code, ...FILES_DEVTOOLS_DIAGNOSTICS[code], ...(message ? { message } : {}) })\n\nexport const isFilesDevtoolsDiagnostic = (value: unknown): value is FilesDevtoolsDiagnostic =>\n Boolean(\n value &&\n typeof value === 'object' &&\n 'code' in value &&\n typeof value.code === 'string' &&\n Object.hasOwn(FILES_DEVTOOLS_DIAGNOSTICS, value.code) &&\n 'level' in value &&\n (value.level === 'info' || value.level === 'warning' || value.level === 'error') &&\n 'message' in value &&\n typeof value.message === 'string',\n )\n\nexport type FilesDevtoolsFailureKind = 'upload' | 'delete' | 'initialization' | 'gateway'\n\nexport interface FilesDevtoolsFailure {\n kind: FilesDevtoolsFailureKind\n message: string\n target?: string\n}\n\nexport const isFilesDevtoolsFailure = (value: unknown): value is FilesDevtoolsFailure =>\n Boolean(\n value &&\n typeof value === 'object' &&\n 'kind' in value &&\n (value.kind === 'upload' ||\n value.kind === 'delete' ||\n value.kind === 'initialization' ||\n value.kind === 'gateway') &&\n 'message' in value &&\n typeof value.message === 'string' &&\n (!('target' in value) || value.target === undefined || typeof value.target === 'string'),\n )\n"],"mappings":";AAAA,MAAM,kBACF;AAUJ,MAAa,6BAA6B;CACtC,2BAA2B;EACvB,OAAO;EACP,SAAS;EACT,MAAM;EACN,MAAM;CACV;CACA,2BAA2B;EACvB,OAAO;EACP,SAAS;EACT,MAAM;EACN,MAAM;CACV;CACA,gCAAgC;EAC5B,OAAO;EACP,SAAS;EACT,MAAM;EACN,MAAM;CACV;CACA,2BAA2B;EACvB,OAAO;EACP,SAAS;EACT,MAAM;EACN,MAAM;CACV;AACJ;AAIA,MAAa,iCACT,MACA,aAC2B;CAAE;CAAM,GAAG,2BAA2B;CAAO,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAG;AAE5G,MAAa,6BAA6B,UACtC,QACI,SACA,OAAO,UAAU,YACjB,UAAU,SACV,OAAO,MAAM,SAAS,YACtB,OAAO,OAAO,4BAA4B,MAAM,IAAI,KACpD,WAAW,UACV,MAAM,UAAU,UAAU,MAAM,UAAU,aAAa,MAAM,UAAU,YACxE,aAAa,SACb,OAAO,MAAM,YAAY,QAC7B;AAUJ,MAAa,0BAA0B,UACnC,QACI,SACA,OAAO,UAAU,YACjB,UAAU,UACT,MAAM,SAAS,YACZ,MAAM,SAAS,YACf,MAAM,SAAS,oBACf,MAAM,SAAS,cACnB,aAAa,SACb,OAAO,MAAM,YAAY,aACxB,EAAE,YAAY,UAAU,MAAM,WAAW,KAAA,KAAa,OAAO,MAAM,WAAW,SACnF"}
@@ -0,0 +1,9 @@
1
+ //#region src/devtools/enabled.d.ts
2
+ export interface FilesDevtoolsOptions {
3
+ /** Enable Files SDK development tools when Nuxt DevTools is available. */
4
+ enabled?: boolean;
5
+ /** Allow uploads and deletes from the development-only file browser. Defaults to true. */
6
+ write?: boolean;
7
+ }
8
+ //#endregion
9
+ //# sourceMappingURL=enabled.d.ts.map
@@ -1,6 +1,7 @@
1
1
  //#region src/devtools/enabled.ts
2
- const shouldEnableFilesDevtools = (development, moduleEnabled, nuxtDevtools) => development && moduleEnabled && (typeof nuxtDevtools === "boolean" ? nuxtDevtools : nuxtDevtools.enabled);
2
+ const shouldEnableFilesDevtools = (development, moduleDevtools, nuxtDevtools) => development && (typeof moduleDevtools === "boolean" ? moduleDevtools : moduleDevtools.enabled !== false) && (typeof nuxtDevtools === "boolean" ? nuxtDevtools : nuxtDevtools?.enabled !== false);
3
+ const filesDevtoolsWriteEnabled = (setting) => typeof setting === "boolean" ? setting : setting.enabled !== false && setting.write !== false;
3
4
  //#endregion
4
- export { shouldEnableFilesDevtools };
5
+ export { filesDevtoolsWriteEnabled, shouldEnableFilesDevtools };
5
6
 
6
7
  //# sourceMappingURL=enabled.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"enabled.js","names":[],"sources":["../../src/devtools/enabled.ts"],"sourcesContent":["export const shouldEnableFilesDevtools = (\n development: boolean,\n moduleEnabled: boolean,\n nuxtDevtools: boolean | { enabled: boolean },\n): boolean => development && moduleEnabled && (typeof nuxtDevtools === 'boolean' ? nuxtDevtools : nuxtDevtools.enabled)\n"],"mappings":";AAAA,MAAa,6BACT,aACA,eACA,iBACU,eAAe,kBAAkB,OAAO,iBAAiB,YAAY,eAAe,aAAa"}
1
+ {"version":3,"file":"enabled.js","names":[],"sources":["../../src/devtools/enabled.ts"],"sourcesContent":["export interface FilesDevtoolsOptions {\n /** Enable Files SDK development tools when Nuxt DevTools is available. */\n enabled?: boolean\n /** Allow uploads and deletes from the development-only file browser. Defaults to true. */\n write?: boolean\n}\n\nexport type FilesDevtoolsSetting = boolean | FilesDevtoolsOptions\n\nexport const shouldEnableFilesDevtools = (\n development: boolean,\n moduleDevtools: FilesDevtoolsSetting,\n nuxtDevtools?: boolean | { enabled?: boolean },\n): boolean =>\n development &&\n (typeof moduleDevtools === 'boolean' ? moduleDevtools : moduleDevtools.enabled !== false) &&\n (typeof nuxtDevtools === 'boolean' ? nuxtDevtools : nuxtDevtools?.enabled !== false)\n\nexport const filesDevtoolsWriteEnabled = (setting: FilesDevtoolsSetting): boolean =>\n typeof setting === 'boolean' ? setting : setting.enabled !== false && setting.write !== false\n"],"mappings":";AASA,MAAa,6BACT,aACA,gBACA,iBAEA,gBACC,OAAO,mBAAmB,YAAY,iBAAiB,eAAe,YAAY,WAClF,OAAO,iBAAiB,YAAY,eAAe,cAAc,YAAY;AAElF,MAAa,6BAA6B,YACtC,OAAO,YAAY,YAAY,UAAU,QAAQ,YAAY,SAAS,QAAQ,UAAU"}
@@ -0,0 +1,5 @@
1
+ //#region src/devtools/files-read.d.ts
2
+ declare const _default: (event: Parameters<import("files-sdk/nitro").NitroRouteHandler>[0]) => Promise<Response>;
3
+ //#endregion
4
+ export { _default as default };
5
+ //# sourceMappingURL=files-read.d.ts.map
@@ -0,0 +1,7 @@
1
+ import { createFilesDevtoolsHandler } from "./files.js";
2
+ //#region src/devtools/files-read.ts
3
+ var files_read_default = createFilesDevtoolsHandler(false);
4
+ //#endregion
5
+ export { files_read_default as default };
6
+
7
+ //# sourceMappingURL=files-read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files-read.js","names":[],"sources":["../../src/devtools/files-read.ts"],"sourcesContent":["import { createFilesDevtoolsHandler } from './files'\n\nexport default createFilesDevtoolsHandler(false)\n"],"mappings":";;AAEA,IAAA,qBAAe,2BAA2B,KAAK"}
@@ -0,0 +1,5 @@
1
+ //#region src/devtools/files-write.d.ts
2
+ declare const _default: (event: Parameters<import("files-sdk/nitro").NitroRouteHandler>[0]) => Promise<Response>;
3
+ //#endregion
4
+ export { _default as default };
5
+ //# sourceMappingURL=files-write.d.ts.map
@@ -0,0 +1,7 @@
1
+ import { createFilesDevtoolsHandler } from "./files.js";
2
+ //#region src/devtools/files-write.ts
3
+ var files_write_default = createFilesDevtoolsHandler(true);
4
+ //#endregion
5
+ export { files_write_default as default };
6
+
7
+ //# sourceMappingURL=files-write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files-write.js","names":[],"sources":["../../src/devtools/files-write.ts"],"sourcesContent":["import { createFilesDevtoolsHandler } from './files'\n\nexport default createFilesDevtoolsHandler(true)\n"],"mappings":";;AAEA,IAAA,sBAAe,2BAA2B,IAAI"}
@@ -0,0 +1,48 @@
1
+ import { inspectFiles, useServerFiles } from "../runtime.js";
2
+ import { FILES_DEVTOOLS_MAX_UPLOAD_SIZE } from "./snapshot.js";
3
+ import { createFilesRouter } from "files-sdk/api";
4
+ import { createRouteHandler } from "files-sdk/nitro";
5
+ //#region src/devtools/files.ts
6
+ const readOperations = [
7
+ "capabilities",
8
+ "list",
9
+ "exists",
10
+ "download"
11
+ ];
12
+ const writeOperations = [
13
+ ...readOperations,
14
+ "upload",
15
+ "delete"
16
+ ];
17
+ const filesDevtoolsOperations = (write) => write ? writeOperations : readOperations;
18
+ const getFiles = useServerFiles;
19
+ const resolveFiles = (request) => {
20
+ const requested = new URL(request.url).searchParams.get("storage") ?? void 0;
21
+ const storages = inspectFiles().storages;
22
+ if (storages.length === 1 && storages[0]?.name === void 0) {
23
+ if (requested !== void 0) throw new Error(`[nuxt-files-sdk:unknown-storage] Unknown storage "${requested}".`);
24
+ return getFiles();
25
+ }
26
+ if (requested === void 0 || !storages.some(({ name }) => name === requested)) throw new Error("[nuxt-files-sdk:unknown-storage] Select a configured storage.");
27
+ return getFiles(requested);
28
+ };
29
+ const createFilesDevtoolsHandler = (write) => {
30
+ const handleFiles = createRouteHandler(createFilesRouter({
31
+ files: resolveFiles,
32
+ operations: filesDevtoolsOperations(write),
33
+ maxUploadSize: FILES_DEVTOOLS_MAX_UPLOAD_SIZE,
34
+ secret: crypto.randomUUID()
35
+ }));
36
+ return (event) => {
37
+ const url = new URL(event.node.req.url ?? "/", "http://nuxt-files-sdk.local");
38
+ if (event.node.req.method === "GET" && url.searchParams.get("op") === "devtools") return Promise.resolve(Response.json({
39
+ write,
40
+ maxUploadSize: FILES_DEVTOOLS_MAX_UPLOAD_SIZE
41
+ }));
42
+ return handleFiles(event);
43
+ };
44
+ };
45
+ //#endregion
46
+ export { createFilesDevtoolsHandler, filesDevtoolsOperations };
47
+
48
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","names":[],"sources":["../../src/devtools/files.ts"],"sourcesContent":["import type { Files } from 'files-sdk'\nimport { createFilesRouter, type FilesOperation } from 'files-sdk/api'\nimport { createRouteHandler } from 'files-sdk/nitro'\n\nimport { inspectFiles, useServerFiles } from '../runtime'\nimport { FILES_DEVTOOLS_MAX_UPLOAD_SIZE } from './snapshot'\n\nconst readOperations = ['capabilities', 'list', 'exists', 'download'] as const satisfies readonly FilesOperation[]\nconst writeOperations = [...readOperations, 'upload', 'delete'] as const satisfies readonly FilesOperation[]\nexport const filesDevtoolsOperations = (write: boolean): readonly FilesOperation[] =>\n write ? writeOperations : readOperations\nconst getFiles: (name?: string) => Files = useServerFiles\n\nconst resolveFiles = (request: Request): Files => {\n const requested = new URL(request.url).searchParams.get('storage') ?? undefined\n const storages = inspectFiles().storages\n if (storages.length === 1 && storages[0]?.name === undefined) {\n if (requested !== undefined) throw new Error(`[nuxt-files-sdk:unknown-storage] Unknown storage \"${requested}\".`)\n return getFiles()\n }\n if (requested === undefined || !storages.some(({ name }) => name === requested)) {\n throw new Error('[nuxt-files-sdk:unknown-storage] Select a configured storage.')\n }\n return getFiles(requested)\n}\n\nexport const createFilesDevtoolsHandler = (write: boolean) => {\n const handleFiles = createRouteHandler(\n createFilesRouter({\n files: resolveFiles,\n operations: filesDevtoolsOperations(write),\n maxUploadSize: FILES_DEVTOOLS_MAX_UPLOAD_SIZE,\n secret: crypto.randomUUID(),\n }),\n )\n return (event: Parameters<typeof handleFiles>[0]): Promise<Response> => {\n const url = new URL(event.node.req.url ?? '/', 'http://nuxt-files-sdk.local')\n if (event.node.req.method === 'GET' && url.searchParams.get('op') === 'devtools') {\n return Promise.resolve(Response.json({ write, maxUploadSize: FILES_DEVTOOLS_MAX_UPLOAD_SIZE }))\n }\n return handleFiles(event)\n }\n}\n"],"mappings":";;;;;AAOA,MAAM,iBAAiB;CAAC;CAAgB;CAAQ;CAAU;AAAU;AACpE,MAAM,kBAAkB;CAAC,GAAG;CAAgB;CAAU;AAAQ;AAC9D,MAAa,2BAA2B,UACpC,QAAQ,kBAAkB;AAC9B,MAAM,WAAqC;AAE3C,MAAM,gBAAgB,YAA4B;CAC9C,MAAM,YAAY,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC,aAAa,IAAI,SAAS,KAAK,KAAA;CACtE,MAAM,WAAW,aAAa,CAAC,CAAC;CAChC,IAAI,SAAS,WAAW,KAAK,SAAS,EAAE,EAAE,SAAS,KAAA,GAAW;EAC1D,IAAI,cAAc,KAAA,GAAW,MAAM,IAAI,MAAM,qDAAqD,UAAU,GAAG;EAC/G,OAAO,SAAS;CACpB;CACA,IAAI,cAAc,KAAA,KAAa,CAAC,SAAS,MAAM,EAAE,WAAW,SAAS,SAAS,GAC1E,MAAM,IAAI,MAAM,+DAA+D;CAEnF,OAAO,SAAS,SAAS;AAC7B;AAEA,MAAa,8BAA8B,UAAmB;CAC1D,MAAM,cAAc,mBAChB,kBAAkB;EACd,OAAO;EACP,YAAY,wBAAwB,KAAK;EACzC,eAAe;EACf,QAAQ,OAAO,WAAW;CAC9B,CAAC,CACL;CACA,QAAQ,UAAgE;EACpE,MAAM,MAAM,IAAI,IAAI,MAAM,KAAK,IAAI,OAAO,KAAK,6BAA6B;EAC5E,IAAI,MAAM,KAAK,IAAI,WAAW,SAAS,IAAI,aAAa,IAAI,IAAI,MAAM,YAClE,OAAO,QAAQ,QAAQ,SAAS,KAAK;GAAE;GAAO,eAAe;EAA+B,CAAC,CAAC;EAElG,OAAO,YAAY,KAAK;CAC5B;AACJ"}
@@ -1,16 +1,23 @@
1
+ import { FILES_DEVTOOLS_MAX_UPLOAD_SIZE, FILES_DEVTOOLS_PATH, FILES_GATEWAY_PATH, FILES_SNAPSHOT_PATH } from "./snapshot.js";
1
2
  import nuxt_v3_handler_default from "./nuxt-v3-handler.js";
2
- import { FILES_DEVTOOLS_PATH, FILES_SNAPSHOT_PATH } from "./snapshot.js";
3
3
  import { setupNuxtV3Devtools } from "./nuxt-v3.js";
4
4
  import { setupNuxtV4Devtools } from "./nuxt-v4.js";
5
5
  import { addDevServerHandler, addServerHandler } from "@nuxt/kit";
6
6
  import { fileURLToPath } from "node:url";
7
7
  //#region src/devtools/index.ts
8
- const setupFilesDevtools = (nuxt, version) => {
8
+ const setupFilesDevtools = (nuxt, version, write) => {
9
9
  addServerHandler({
10
10
  route: FILES_SNAPSHOT_PATH,
11
11
  handler: fileURLToPath(new URL("./snapshot.js", import.meta.url))
12
12
  });
13
- if (Number.parseInt(version) >= 4) setupNuxtV4Devtools(nuxt);
13
+ addServerHandler({
14
+ route: FILES_GATEWAY_PATH,
15
+ handler: fileURLToPath(new URL(write ? "./files-write.js" : "./files-read.js", import.meta.url))
16
+ });
17
+ if (Number.parseInt(version) >= 4) setupNuxtV4Devtools(nuxt, {
18
+ write,
19
+ maxUploadSize: FILES_DEVTOOLS_MAX_UPLOAD_SIZE
20
+ });
14
21
  else {
15
22
  addDevServerHandler({
16
23
  route: FILES_DEVTOOLS_PATH,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["uiHandler"],"sources":["../../src/devtools/index.ts"],"sourcesContent":["import { fileURLToPath } from 'node:url'\n\nimport { addDevServerHandler, addServerHandler } from '@nuxt/kit'\nimport type { Nuxt } from '@nuxt/schema'\n\nimport { setupNuxtV3Devtools } from './nuxt-v3'\nimport uiHandler from './nuxt-v3-handler'\nimport { setupNuxtV4Devtools } from './nuxt-v4'\nimport { FILES_DEVTOOLS_PATH, FILES_SNAPSHOT_PATH } from './snapshot'\n\nexport const setupFilesDevtools = (nuxt: Nuxt, version: string): void => {\n // Snapshot must run inside Nitro's worker, where the runtime registry lives.\n addServerHandler({\n route: FILES_SNAPSHOT_PATH,\n handler: fileURLToPath(new URL('./snapshot.js', import.meta.url)),\n })\n if (Number.parseInt(version) >= 4) {\n setupNuxtV4Devtools(nuxt)\n } else {\n addDevServerHandler({\n route: FILES_DEVTOOLS_PATH,\n handler: uiHandler,\n })\n setupNuxtV3Devtools(nuxt)\n }\n}\n"],"mappings":";;;;;;;AAUA,MAAa,sBAAsB,MAAY,YAA0B;CAErE,iBAAiB;EACb,OAAO;EACP,SAAS,cAAc,IAAI,IAAI,iBAAiB,YAAY,GAAG,CAAC;CACpE,CAAC;CACD,IAAI,OAAO,SAAS,OAAO,KAAK,GAC5B,oBAAoB,IAAI;MACrB;EACH,oBAAoB;GAChB,OAAO;GACP,SAASA;EACb,CAAC;EACD,oBAAoB,IAAI;CAC5B;AACJ"}
1
+ {"version":3,"file":"index.js","names":["uiHandler"],"sources":["../../src/devtools/index.ts"],"sourcesContent":["import { fileURLToPath } from 'node:url'\n\nimport { addDevServerHandler, addServerHandler } from '@nuxt/kit'\nimport type { Nuxt } from '@nuxt/schema'\n\nimport { setupNuxtV3Devtools } from './nuxt-v3'\nimport uiHandler from './nuxt-v3-handler'\nimport { setupNuxtV4Devtools } from './nuxt-v4'\nimport {\n FILES_DEVTOOLS_MAX_UPLOAD_SIZE,\n FILES_DEVTOOLS_PATH,\n FILES_GATEWAY_PATH,\n FILES_SNAPSHOT_PATH,\n} from './snapshot'\n\nexport const setupFilesDevtools = (nuxt: Nuxt, version: string, write: boolean): void => {\n // Snapshot must run inside Nitro's worker, where the runtime registry lives.\n addServerHandler({\n route: FILES_SNAPSHOT_PATH,\n handler: fileURLToPath(new URL('./snapshot.js', import.meta.url)),\n })\n addServerHandler({\n route: FILES_GATEWAY_PATH,\n handler: fileURLToPath(new URL(write ? './files-write.js' : './files-read.js', import.meta.url)),\n })\n if (Number.parseInt(version) >= 4) {\n setupNuxtV4Devtools(nuxt, { write, maxUploadSize: FILES_DEVTOOLS_MAX_UPLOAD_SIZE })\n } else {\n addDevServerHandler({\n route: FILES_DEVTOOLS_PATH,\n handler: uiHandler,\n })\n setupNuxtV3Devtools(nuxt)\n }\n}\n"],"mappings":";;;;;;;AAeA,MAAa,sBAAsB,MAAY,SAAiB,UAAyB;CAErF,iBAAiB;EACb,OAAO;EACP,SAAS,cAAc,IAAI,IAAI,iBAAiB,YAAY,GAAG,CAAC;CACpE,CAAC;CACD,iBAAiB;EACb,OAAO;EACP,SAAS,cAAc,IAAI,IAAI,QAAQ,qBAAqB,mBAAmB,YAAY,GAAG,CAAC;CACnG,CAAC;CACD,IAAI,OAAO,SAAS,OAAO,KAAK,GAC5B,oBAAoB,MAAM;EAAE;EAAO,eAAe;CAA+B,CAAC;MAC/E;EACH,oBAAoB;GAChB,OAAO;GACP,SAASA;EACb,CAAC;EACD,oBAAoB,IAAI;CAC5B;AACJ"}
@@ -1,10 +1,22 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  //#region src/devtools/nuxt-v3-handler.ts
3
- const html = readFile(new URL("./client/index.html", import.meta.url), "utf8");
3
+ const html = {
4
+ contentType: "text/html; charset=utf-8",
5
+ content: readFile(new URL("./client/index.html", import.meta.url), "utf8")
6
+ };
7
+ const assets = /* @__PURE__ */ new Map([
8
+ ["/", html],
9
+ ["/index.html", html],
10
+ ["/app.js", {
11
+ contentType: "text/javascript; charset=utf-8",
12
+ content: readFile(new URL("./client/app.js", import.meta.url), "utf8")
13
+ }]
14
+ ]);
4
15
  var nuxt_v3_handler_default = async (event) => {
5
- if (event.path !== "/" && event.path !== "/index.html") return void 0;
6
- event.node.res.setHeader("content-type", "text/html; charset=utf-8");
7
- return html;
16
+ const asset = assets.get(event.path);
17
+ if (!asset) return void 0;
18
+ event.node.res.setHeader("content-type", asset.contentType);
19
+ return asset.content;
8
20
  };
9
21
  //#endregion
10
22
  export { nuxt_v3_handler_default as default };
@@ -1 +1 @@
1
- {"version":3,"file":"nuxt-v3-handler.js","names":[],"sources":["../../src/devtools/nuxt-v3-handler.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises'\n\nconst html = readFile(new URL('./client/index.html', import.meta.url), 'utf8')\n\nexport default async (event: { path: string; node: { res: { setHeader(name: string, value: string): void } } }) => {\n if (event.path !== '/' && event.path !== '/index.html') return undefined\n event.node.res.setHeader('content-type', 'text/html; charset=utf-8')\n return html\n}\n"],"mappings":";;AAEA,MAAM,OAAO,SAAS,IAAI,IAAI,uBAAuB,YAAY,GAAG,GAAG,MAAM;AAE7E,IAAA,0BAAe,OAAO,UAA6F;CAC/G,IAAI,MAAM,SAAS,OAAO,MAAM,SAAS,eAAe,OAAO,KAAA;CAC/D,MAAM,KAAK,IAAI,UAAU,gBAAgB,0BAA0B;CACnE,OAAO;AACX"}
1
+ {"version":3,"file":"nuxt-v3-handler.js","names":[],"sources":["../../src/devtools/nuxt-v3-handler.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises'\n\nconst html = {\n contentType: 'text/html; charset=utf-8',\n content: readFile(new URL('./client/index.html', import.meta.url), 'utf8'),\n}\nconst assets = new Map([\n ['/', html],\n ['/index.html', html],\n [\n '/app.js',\n {\n contentType: 'text/javascript; charset=utf-8',\n content: readFile(new URL('./client/app.js', import.meta.url), 'utf8'),\n },\n ],\n])\n\nexport default async (event: { path: string; node: { res: { setHeader(name: string, value: string): void } } }) => {\n const asset = assets.get(event.path)\n if (!asset) return undefined\n event.node.res.setHeader('content-type', asset.contentType)\n return asset.content\n}\n"],"mappings":";;AAEA,MAAM,OAAO;CACT,aAAa;CACb,SAAS,SAAS,IAAI,IAAI,uBAAuB,YAAY,GAAG,GAAG,MAAM;AAC7E;AACA,MAAM,yBAAS,IAAI,IAAI;CACnB,CAAC,KAAK,IAAI;CACV,CAAC,eAAe,IAAI;CACpB,CACI,WACA;EACI,aAAa;EACb,SAAS,SAAS,IAAI,IAAI,mBAAmB,YAAY,GAAG,GAAG,MAAM;CACzE,CACJ;AACJ,CAAC;AAED,IAAA,0BAAe,OAAO,UAA6F;CAC/G,MAAM,QAAQ,OAAO,IAAI,MAAM,IAAI;CACnC,IAAI,CAAC,OAAO,OAAO,KAAA;CACnB,MAAM,KAAK,IAAI,UAAU,gBAAgB,MAAM,WAAW;CAC1D,OAAO,MAAM;AACjB"}
@@ -1,19 +1,50 @@
1
1
  import { FILES_DEVTOOLS_PATH } from "./snapshot.js";
2
- import devframe_default from "./devframe.js";
2
+ import { createFilesDevframe } from "./devframe.js";
3
+ import { NUXT_DEVTOOLS_GROUP_ID, onDevtoolsReady } from "@nuxt/devtools-kit";
3
4
  import { createEmbedded } from "devframe/adapters/embedded";
4
5
  //#region src/devtools/nuxt-v4.ts
5
- const setupNuxtV4Devtools = (nuxt) => {
6
- nuxt.hook("devtools:ready", async (context) => {
7
- await createEmbedded(devframe_default, { ctx: context });
6
+ const setupNuxtV4Devtools = (nuxt, options) => {
7
+ onDevtoolsReady(async (context) => {
8
+ await createEmbedded(createFilesDevframe({
9
+ ...options,
10
+ notifyFailure: (message) => context.messages.add(message)
11
+ }), { ctx: context });
8
12
  context.docks.register({
9
13
  id: "nuxt-files-sdk",
10
14
  title: "Files",
11
15
  icon: "ph:files-duotone",
12
16
  type: "iframe",
13
17
  url: FILES_DEVTOOLS_PATH,
14
- groupId: "nuxt"
18
+ groupId: NUXT_DEVTOOLS_GROUP_ID
15
19
  });
16
- });
20
+ const broadcast = (method) => context.scope("nuxt-files-sdk").rpc.broadcast({
21
+ method,
22
+ args: [],
23
+ optional: true,
24
+ event: true
25
+ });
26
+ context.commands.register({
27
+ id: "nuxt-files-sdk:open",
28
+ title: "Files: Open",
29
+ icon: "ph:files-duotone",
30
+ category: "tools",
31
+ handler: () => context.docks.activate("nuxt-files-sdk")
32
+ });
33
+ context.commands.register({
34
+ id: "nuxt-files-sdk:refresh",
35
+ title: "Files: Refresh",
36
+ icon: "ph:arrow-clockwise-duotone",
37
+ category: "tools",
38
+ handler: () => broadcast("refresh")
39
+ });
40
+ context.commands.register({
41
+ id: "nuxt-files-sdk:copy-diagnostics",
42
+ title: "Files: Copy Diagnostics",
43
+ icon: "ph:copy-duotone",
44
+ category: "tools",
45
+ handler: () => broadcast("copy-diagnostics")
46
+ });
47
+ }, nuxt);
17
48
  };
18
49
  //#endregion
19
50
  export { setupNuxtV4Devtools };
@@ -1 +1 @@
1
- {"version":3,"file":"nuxt-v4.js","names":["filesDevframe"],"sources":["../../src/devtools/nuxt-v4.ts"],"sourcesContent":["import type { Nuxt } from '@nuxt/schema'\nimport { createEmbedded } from 'devframe/adapters/embedded'\n\nimport filesDevframe from './devframe'\nimport { FILES_DEVTOOLS_PATH } from './snapshot'\n\ntype DevtoolsContext = Parameters<typeof createEmbedded>[1]['ctx'] & {\n docks: {\n register(entry: {\n id: string\n title: string\n icon: string\n type: 'iframe'\n url: string\n groupId: string\n }): unknown\n }\n}\n\ndeclare module '@nuxt/schema' {\n interface NuxtHooks {\n 'devtools:ready': (context: DevtoolsContext) => void | Promise<void>\n }\n}\n\nexport const setupNuxtV4Devtools = (nuxt: Nuxt): void => {\n nuxt.hook('devtools:ready', async (context) => {\n await createEmbedded(filesDevframe, { ctx: context })\n context.docks.register({\n id: 'nuxt-files-sdk',\n title: 'Files',\n icon: 'ph:files-duotone',\n type: 'iframe',\n url: FILES_DEVTOOLS_PATH,\n groupId: 'nuxt',\n })\n })\n}\n"],"mappings":";;;;AAyBA,MAAa,uBAAuB,SAAqB;CACrD,KAAK,KAAK,kBAAkB,OAAO,YAAY;EAC3C,MAAM,eAAeA,kBAAe,EAAE,KAAK,QAAQ,CAAC;EACpD,QAAQ,MAAM,SAAS;GACnB,IAAI;GACJ,OAAO;GACP,MAAM;GACN,MAAM;GACN,KAAK;GACL,SAAS;EACb,CAAC;CACL,CAAC;AACL"}
1
+ {"version":3,"file":"nuxt-v4.js","names":[],"sources":["../../src/devtools/nuxt-v4.ts"],"sourcesContent":["import { NUXT_DEVTOOLS_GROUP_ID, onDevtoolsReady } from '@nuxt/devtools-kit'\nimport type { Nuxt } from '@nuxt/schema'\nimport { createEmbedded } from 'devframe/adapters/embedded'\n\nimport { createFilesDevframe } from './devframe'\nimport { FILES_DEVTOOLS_PATH } from './snapshot'\n\nexport const setupNuxtV4Devtools = (nuxt: Nuxt, options: { write: boolean; maxUploadSize: number }): void => {\n onDevtoolsReady(async (context) => {\n await createEmbedded(\n createFilesDevframe({\n ...options,\n notifyFailure: (message) => context.messages.add(message),\n }),\n { ctx: context },\n )\n context.docks.register({\n id: 'nuxt-files-sdk',\n title: 'Files',\n icon: 'ph:files-duotone',\n type: 'iframe',\n url: FILES_DEVTOOLS_PATH,\n groupId: NUXT_DEVTOOLS_GROUP_ID,\n })\n\n const broadcast = (method: 'refresh' | 'copy-diagnostics') =>\n context.scope('nuxt-files-sdk').rpc.broadcast({ method, args: [], optional: true, event: true })\n context.commands.register({\n id: 'nuxt-files-sdk:open',\n title: 'Files: Open',\n icon: 'ph:files-duotone',\n category: 'tools',\n handler: () => context.docks.activate('nuxt-files-sdk'),\n })\n context.commands.register({\n id: 'nuxt-files-sdk:refresh',\n title: 'Files: Refresh',\n icon: 'ph:arrow-clockwise-duotone',\n category: 'tools',\n handler: () => broadcast('refresh'),\n })\n context.commands.register({\n id: 'nuxt-files-sdk:copy-diagnostics',\n title: 'Files: Copy Diagnostics',\n icon: 'ph:copy-duotone',\n category: 'tools',\n handler: () => broadcast('copy-diagnostics'),\n })\n }, nuxt)\n}\n"],"mappings":";;;;;AAOA,MAAa,uBAAuB,MAAY,YAA6D;CACzG,gBAAgB,OAAO,YAAY;EAC/B,MAAM,eACF,oBAAoB;GAChB,GAAG;GACH,gBAAgB,YAAY,QAAQ,SAAS,IAAI,OAAO;EAC5D,CAAC,GACD,EAAE,KAAK,QAAQ,CACnB;EACA,QAAQ,MAAM,SAAS;GACnB,IAAI;GACJ,OAAO;GACP,MAAM;GACN,MAAM;GACN,KAAK;GACL,SAAS;EACb,CAAC;EAED,MAAM,aAAa,WACf,QAAQ,MAAM,gBAAgB,CAAC,CAAC,IAAI,UAAU;GAAE;GAAQ,MAAM,CAAC;GAAG,UAAU;GAAM,OAAO;EAAK,CAAC;EACnG,QAAQ,SAAS,SAAS;GACtB,IAAI;GACJ,OAAO;GACP,MAAM;GACN,UAAU;GACV,eAAe,QAAQ,MAAM,SAAS,gBAAgB;EAC1D,CAAC;EACD,QAAQ,SAAS,SAAS;GACtB,IAAI;GACJ,OAAO;GACP,MAAM;GACN,UAAU;GACV,eAAe,UAAU,SAAS;EACtC,CAAC;EACD,QAAQ,SAAS,SAAS;GACtB,IAAI;GACJ,OAAO;GACP,MAAM;GACN,UAAU;GACV,eAAe,UAAU,kBAAkB;EAC/C,CAAC;CACL,GAAG,IAAI;AACX"}
@@ -1,3 +1,4 @@
1
+ import { FilesDevtoolsDiagnostic } from "./diagnostics.js";
1
2
  //#region src/devtools/snapshot.d.ts
2
3
  export interface FilesDevtoolsSnapshot {
3
4
  storages: Array<{
@@ -7,14 +8,12 @@ export interface FilesDevtoolsSnapshot {
7
8
  source: 'storage' | 'devStorage';
8
9
  initialized: boolean;
9
10
  }>;
10
- diagnostics: Array<{
11
- code: string;
12
- level: 'info' | 'warning' | 'error';
13
- message: string;
14
- }>;
11
+ diagnostics: FilesDevtoolsDiagnostic[];
15
12
  }
16
13
  export declare const FILES_DEVTOOLS_PATH = "/__nuxt-files-sdk/";
17
14
  export declare const FILES_SNAPSHOT_PATH = "/__nuxt-files-sdk/snapshot";
15
+ export declare const FILES_GATEWAY_PATH = "/__nuxt-files-sdk/files";
16
+ export declare const FILES_DEVTOOLS_MAX_UPLOAD_SIZE: number;
18
17
  declare function _default(): FilesDevtoolsSnapshot;
19
18
  //#endregion
20
19
  export { _default as default };
@@ -2,8 +2,10 @@ import { inspectFiles } from "../runtime.js";
2
2
  //#region src/devtools/snapshot.ts
3
3
  const FILES_DEVTOOLS_PATH = "/__nuxt-files-sdk/";
4
4
  const FILES_SNAPSHOT_PATH = `${FILES_DEVTOOLS_PATH}snapshot`;
5
+ const FILES_GATEWAY_PATH = `${FILES_DEVTOOLS_PATH}files`;
6
+ const FILES_DEVTOOLS_MAX_UPLOAD_SIZE = 10485760;
5
7
  var snapshot_default = () => inspectFiles();
6
8
  //#endregion
7
- export { FILES_DEVTOOLS_PATH, FILES_SNAPSHOT_PATH, snapshot_default as default };
9
+ export { FILES_DEVTOOLS_MAX_UPLOAD_SIZE, FILES_DEVTOOLS_PATH, FILES_GATEWAY_PATH, FILES_SNAPSHOT_PATH, snapshot_default as default };
8
10
 
9
11
  //# sourceMappingURL=snapshot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.js","names":[],"sources":["../../src/devtools/snapshot.ts"],"sourcesContent":["import { inspectFiles } from '../runtime'\n\nexport interface FilesDevtoolsSnapshot {\n storages: Array<{\n name?: string\n adapter: string\n plugins: string[]\n source: 'storage' | 'devStorage'\n initialized: boolean\n }>\n diagnostics: Array<{\n code: string\n level: 'info' | 'warning' | 'error'\n message: string\n }>\n}\n\nexport const FILES_DEVTOOLS_PATH = '/__nuxt-files-sdk/'\nexport const FILES_SNAPSHOT_PATH = `${FILES_DEVTOOLS_PATH}snapshot`\n\nexport default () => inspectFiles()\n"],"mappings":";;AAiBA,MAAa,sBAAsB;AACnC,MAAa,sBAAsB,GAAG,oBAAoB;AAE1D,IAAA,yBAAqB,aAAa"}
1
+ {"version":3,"file":"snapshot.js","names":[],"sources":["../../src/devtools/snapshot.ts"],"sourcesContent":["import { inspectFiles } from '../runtime'\nimport type { FilesDevtoolsDiagnostic } from './diagnostics'\n\nexport interface FilesDevtoolsSnapshot {\n storages: Array<{\n name?: string\n adapter: string\n plugins: string[]\n source: 'storage' | 'devStorage'\n initialized: boolean\n }>\n diagnostics: FilesDevtoolsDiagnostic[]\n}\n\nexport const FILES_DEVTOOLS_PATH = '/__nuxt-files-sdk/'\nexport const FILES_SNAPSHOT_PATH = `${FILES_DEVTOOLS_PATH}snapshot`\nexport const FILES_GATEWAY_PATH = `${FILES_DEVTOOLS_PATH}files`\nexport const FILES_DEVTOOLS_MAX_UPLOAD_SIZE = 10 * 1024 * 1024\n\nexport default () => inspectFiles()\n"],"mappings":";;AAcA,MAAa,sBAAsB;AACnC,MAAa,sBAAsB,GAAG,oBAAoB;AAC1D,MAAa,qBAAqB,GAAG,oBAAoB;AACzD,MAAa,iCAAiC;AAE9C,IAAA,yBAAqB,aAAa"}
@@ -1,4 +1,3 @@
1
- import "../config.js";
2
1
  import { ProviderSlug } from "files-sdk";
3
2
  //#region src/integration/nitro.d.ts
4
3
  export interface NitroIntegration {
@@ -16,6 +15,9 @@ export interface NitroIntegration {
16
15
  };
17
16
  };
18
17
  unimport?: {
18
+ injectImports(code: string, id?: string): Promise<{
19
+ code: string;
20
+ }>;
19
21
  getInternalContext(): {
20
22
  addons: {
21
23
  name?: string;
@@ -27,6 +29,9 @@ export interface NitroIntegration {
27
29
  hook(name: 'types:extend', callback: (types: {
28
30
  tsConfig?: {
29
31
  include?: string[];
32
+ compilerOptions?: {
33
+ paths?: Record<string, string[]>;
34
+ };
30
35
  };
31
36
  }) => void | Promise<void>): void;
32
37
  };
@@ -1,23 +1,32 @@
1
1
  import { resolve } from "node:path";
2
- import { mkdir, writeFile } from "node:fs/promises";
2
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
3
3
  import { getProvider } from "files-sdk/providers";
4
4
  import { createJiti } from "jiti";
5
5
  //#region src/integration/nitro.ts
6
6
  const isStorageConfig = (value) => Boolean(value && typeof value === "object" && "adapter" in value && typeof value.adapter === "string");
7
7
  const isStorageRecord = (value) => Boolean(value && typeof value === "object" && Object.values(value).every(isStorageConfig));
8
8
  const selectedAdapters = (config, development) => {
9
- const storage = config.storage;
10
- const devStorage = config.devStorage;
11
- if (!storage || !isStorageConfig(storage) && (!isStorageRecord(storage) || Object.keys(storage).length === 0)) throw new Error("[nuxt-files-sdk:invalid-config] At least one storage is required.");
9
+ if (!config || typeof config !== "object") throw new Error("[nuxt-files-sdk:invalid-config] Files configuration must be an object.");
10
+ const typedConfig = config;
11
+ const storage = typedConfig.storage;
12
+ const devStorage = typedConfig.devStorage;
13
+ if (!storage && !development) return void 0;
14
+ if (!storage && !devStorage) throw new Error("[nuxt-files-sdk:invalid-config] At least one storage is required.");
12
15
  const selected = [];
13
- const single = isStorageConfig(storage);
14
- if (single) {
16
+ const single = isStorageConfig(storage ?? devStorage);
17
+ if (!storage) {
18
+ if (isStorageConfig(devStorage)) selected.push(devStorage);
19
+ else if (isStorageRecord(devStorage) && Object.keys(devStorage).length > 0) selected.push(...Object.values(devStorage));
20
+ else throw new Error("[nuxt-files-sdk:invalid-config] At least one development storage is required.");
21
+ } else if (!isStorageConfig(storage) && (!isStorageRecord(storage) || Object.keys(storage).length === 0)) throw new Error("[nuxt-files-sdk:invalid-config] At least one storage is required.");
22
+ else if (isStorageConfig(storage)) {
15
23
  if (devStorage && !isStorageConfig(devStorage)) throw new Error("[nuxt-files-sdk:invalid-config] A single storage requires a single devStorage override.");
16
24
  selected.push(development && isStorageConfig(devStorage) ? devStorage : storage);
17
25
  } else {
18
26
  if (devStorage && !isStorageRecord(devStorage)) throw new Error("[nuxt-files-sdk:invalid-config] Named storage requires named devStorage overrides.");
19
- for (const name of Object.keys(devStorage ?? {})) if (!Object.hasOwn(storage, name)) throw new Error(`[nuxt-files-sdk:unknown-storage] Unknown storage "${name}".`);
20
- for (const [name, namedStorage] of Object.entries(storage)) selected.push(development ? devStorage?.[name] ?? namedStorage : namedStorage);
27
+ const overrides = isStorageRecord(devStorage) ? devStorage : void 0;
28
+ for (const name of Object.keys(overrides ?? {})) if (!Object.hasOwn(storage, name)) throw new Error(`[nuxt-files-sdk:unknown-storage] Unknown storage "${name}".`);
29
+ for (const [name, namedStorage] of Object.entries(storage)) selected.push(development ? overrides?.[name] ?? namedStorage : namedStorage);
21
30
  }
22
31
  const adapters = [...new Set(selected.map(({ adapter }) => adapter))].toSorted();
23
32
  for (const adapter of adapters) if (!getProvider(adapter)) throw new Error(`[nuxt-files-sdk:unknown-adapter] Unknown adapter "${adapter}".`);
@@ -51,13 +60,23 @@ export {}
51
60
  `;
52
61
  const setupNitroFilesIntegration = async (nitro, options) => {
53
62
  const configPath = options.configPath.replaceAll("\\", "/");
54
- const config = await createJiti(import.meta.url, {
63
+ const jiti = createJiti(import.meta.url, {
55
64
  ...nitro.options.alias ? { alias: nitro.options.alias } : {},
56
65
  interopDefault: true,
57
66
  moduleCache: false
58
- }).import(configPath, { default: true });
59
- const { adapters, single } = selectedAdapters(config, options.development);
67
+ });
68
+ const source = await readFile(configPath, "utf8");
69
+ const code = nitro.unimport ? (await nitro.unimport.injectImports(source, configPath)).code : source;
70
+ const loaded = await jiti.evalModule(code, {
71
+ filename: configPath,
72
+ async: true
73
+ });
74
+ const config = loaded && typeof loaded === "object" && "default" in loaded ? loaded.default : loaded;
75
+ const selected = selectedAdapters(config, options.development);
76
+ if (!selected) return;
77
+ const { adapters, single } = selected;
60
78
  const providers = providerCode(adapters);
79
+ const runtimeConfig = options.development ? "config" : "{ storage: config.storage }";
61
80
  nitro.unimport?.getInternalContext().addons.push({
62
81
  name: "nuxt-files-sdk-jsdoc",
63
82
  declaration: (declarations) => declarations.replace(/^(\s*)(const useServerFiles: typeof .*\.useServerFiles)$/mu, "$1/** Return the project's Files client, including its configured plugin extensions. */\n$1const useServerFiles: typeof import('nuxt-files-sdk/runtime').useServerFiles")
@@ -66,8 +85,9 @@ const setupNitroFilesIntegration = async (nitro, options) => {
66
85
  (externals.inline ??= []).push("nuxt-files-sdk");
67
86
  if (!nitro.options.dev) externals.inline.push("files-sdk");
68
87
  const directory = resolve(nitro.options.buildDir, "nuxt-files-sdk");
69
- const pluginPath = resolve(directory, "plugin.mjs");
88
+ const pluginPath = resolve(directory, options.development ? "plugin.dev.mjs" : "plugin.mjs");
70
89
  const typesPath = resolve(directory, "storage-registry.d.ts");
90
+ const filesSdkTypes = resolve(nitro.options.rootDir, "node_modules/files-sdk/dist").replaceAll("\\", "/");
71
91
  externals.inline.push(pluginPath.replaceAll("\\", "/"), configPath);
72
92
  nitro.options.plugins.push(pluginPath.replaceAll("\\", "/"));
73
93
  nitro.hooks.hook("types:extend", async (types) => {
@@ -76,7 +96,7 @@ const setupNitroFilesIntegration = async (nitro, options) => {
76
96
  ${providers.imports}
77
97
  import { configureFiles } from 'nuxt-files-sdk/runtime'
78
98
 
79
- export default (nitroApp) => configureFiles(config, {
99
+ export default (nitroApp) => configureFiles(${runtimeConfig}, {
80
100
  development: ${JSON.stringify(options.development)},
81
101
  factories: { ${providers.factories} },
82
102
  hooks: {
@@ -86,7 +106,11 @@ export default (nitroApp) => configureFiles(config, {
86
106
  },
87
107
  })
88
108
  `), writeFile(typesPath, storageTypes(configPath, nitro.meta?.majorVersion ?? ("routing" in nitro ? 3 : 2), single))]);
89
- types.tsConfig?.include?.push(typesPath);
109
+ const tsConfig = types.tsConfig ??= {};
110
+ (tsConfig.include ??= []).push(typesPath);
111
+ const paths = (tsConfig.compilerOptions ??= {}).paths ??= {};
112
+ paths["files-sdk"] ??= [`${filesSdkTypes}/index.d.ts`];
113
+ paths["files-sdk/*"] ??= [`${filesSdkTypes}/*/index.d.ts`];
90
114
  });
91
115
  };
92
116
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"nitro.js","names":[],"sources":["../../src/integration/nitro.ts"],"sourcesContent":["import { mkdir, writeFile } from 'node:fs/promises'\nimport { resolve } from 'node:path'\n\nimport type { ProviderSlug } from 'files-sdk'\nimport { getProvider } from 'files-sdk/providers'\nimport { createJiti } from 'jiti'\n\nimport type { FilesConfig, StorageConfig } from '../config'\n\nexport interface NitroIntegration {\n meta?: { majorVersion?: number }\n options: {\n rootDir: string\n buildDir: string\n dev?: boolean\n plugins: string[]\n alias?: Record<string, string>\n externals?: { inline?: unknown[] }\n }\n unimport?: {\n getInternalContext(): {\n addons: {\n name?: string\n declaration?: (declarations: string) => string\n }[]\n }\n }\n hooks: {\n hook(\n name: 'types:extend',\n callback: (types: { tsConfig?: { include?: string[] } }) => void | Promise<void>,\n ): void\n }\n}\n\nexport interface NitroFilesIntegrationOptions {\n configPath: string\n development: boolean\n}\n\nconst isStorageConfig = (value: unknown): value is StorageConfig =>\n Boolean(value && typeof value === 'object' && 'adapter' in value && typeof value.adapter === 'string')\nconst isStorageRecord = (value: unknown): value is Record<string, StorageConfig> =>\n Boolean(value && typeof value === 'object' && Object.values(value).every(isStorageConfig))\n\nexport const selectedAdapters = (\n config: FilesConfig,\n development: boolean,\n): { adapters: ProviderSlug[]; single: boolean } => {\n const storage = config.storage\n const devStorage = config.devStorage\n if (!storage || (!isStorageConfig(storage) && (!isStorageRecord(storage) || Object.keys(storage).length === 0))) {\n throw new Error('[nuxt-files-sdk:invalid-config] At least one storage is required.')\n }\n const selected: StorageConfig[] = []\n const single = isStorageConfig(storage)\n if (single) {\n if (devStorage && !isStorageConfig(devStorage)) {\n throw new Error('[nuxt-files-sdk:invalid-config] A single storage requires a single devStorage override.')\n }\n selected.push(development && isStorageConfig(devStorage) ? devStorage : storage)\n } else {\n if (devStorage && !isStorageRecord(devStorage)) {\n throw new Error('[nuxt-files-sdk:invalid-config] Named storage requires named devStorage overrides.')\n }\n for (const name of Object.keys(devStorage ?? {})) {\n if (!Object.hasOwn(storage, name)) {\n throw new Error(`[nuxt-files-sdk:unknown-storage] Unknown storage \"${name}\".`)\n }\n }\n for (const [name, namedStorage] of Object.entries(storage)) {\n selected.push(development ? (devStorage?.[name] ?? namedStorage) : namedStorage)\n }\n }\n const adapters = [...new Set(selected.map(({ adapter }) => adapter))].toSorted()\n for (const adapter of adapters) {\n if (!getProvider(adapter)) {\n throw new Error(`[nuxt-files-sdk:unknown-adapter] Unknown adapter \"${adapter}\".`)\n }\n }\n return { adapters, single }\n}\n\nconst factoryName = (adapter: ProviderSlug): string =>\n adapter === 'cloudinary'\n ? 'cloudinaryAdapter'\n : adapter.replaceAll(/-([a-z0-9])/gu, (_, character: string) => character.toUpperCase())\n\nexport const providerCode = (adapters: ProviderSlug[]): { imports: string; factories: string } => ({\n imports: adapters\n .map(\n (adapter, index) =>\n `import { ${factoryName(adapter)} as provider${index} } from ${JSON.stringify(`files-sdk/${adapter}`)}`,\n )\n .join('\\n'),\n factories: adapters.map((adapter, index) => `${JSON.stringify(adapter)}: provider${index}`).join(', '),\n})\n\nconst hookTypes = (moduleName: 'nitropack/types' | 'nitro/types'): string => `\ndeclare module ${JSON.stringify(moduleName)} {\n interface NitroRuntimeHooks {\n 'files:action': (payload: { event: import('files-sdk').FilesActionEvent; storage?: string }) => void | Promise<void>\n 'files:error': (payload: { event: import('files-sdk').FilesErrorEvent; storage?: string }) => void | Promise<void>\n 'files:retry': (payload: { event: import('files-sdk').FilesRetryEvent; storage?: string }) => void | Promise<void>\n }\n}\n`\n\nexport const storageTypes = (\n configPath: string,\n nitroMajor: number,\n single: boolean,\n): string => `import type config from ${JSON.stringify(configPath)}\nimport type { SingleStorage, StorageRegistry } from 'nuxt-files-sdk/runtime'\n\ndeclare module 'nuxt-files-sdk/runtime' {\n ${single ? 'interface NuxtFilesSingleStorage { value: SingleStorage<typeof config> }' : 'interface NuxtFilesStorageRegistry extends StorageRegistry<typeof config> {}'}\n}\n${hookTypes(nitroMajor >= 3 ? 'nitro/types' : 'nitropack/types')}\nexport {}\n`\n\nexport const setupNitroFilesIntegration = async (\n nitro: NitroIntegration,\n options: NitroFilesIntegrationOptions,\n): Promise<void> => {\n const configPath = options.configPath.replaceAll('\\\\', '/')\n const config = await createJiti(import.meta.url, {\n ...(nitro.options.alias ? { alias: nitro.options.alias } : {}),\n interopDefault: true,\n moduleCache: false,\n }).import<FilesConfig>(configPath, { default: true })\n const { adapters, single } = selectedAdapters(config, options.development)\n const providers = providerCode(adapters)\n nitro.unimport?.getInternalContext().addons.push({\n name: 'nuxt-files-sdk-jsdoc',\n declaration: (declarations) =>\n declarations.replace(\n /^(\\s*)(const useServerFiles: typeof .*\\.useServerFiles)$/mu,\n \"$1/** Return the project's Files client, including its configured plugin extensions. */\\n$1const useServerFiles: typeof import('nuxt-files-sdk/runtime').useServerFiles\",\n ),\n })\n // Inline both packages so installed consumers also tree-shake the plugin barrel.\n const externals = (nitro.options.externals ??= {})\n ;(externals.inline ??= []).push('nuxt-files-sdk')\n // Nitro's single-file dev build would eagerly import every native provider SDK.\n if (!nitro.options.dev) externals.inline.push('files-sdk')\n const directory = resolve(nitro.options.buildDir, 'nuxt-files-sdk')\n const pluginPath = resolve(directory, 'plugin.mjs')\n const typesPath = resolve(directory, 'storage-registry.d.ts')\n // Development also externalizes local .mjs files unless explicitly inlined.\n externals.inline.push(pluginPath.replaceAll('\\\\', '/'), configPath)\n nitro.options.plugins.push(pluginPath.replaceAll('\\\\', '/'))\n nitro.hooks.hook('types:extend', async (types) => {\n await mkdir(directory, { recursive: true })\n await Promise.all([\n writeFile(\n pluginPath,\n `import config from ${JSON.stringify(configPath)}\n${providers.imports}\nimport { configureFiles } from 'nuxt-files-sdk/runtime'\n\nexport default (nitroApp) => configureFiles(config, {\n development: ${JSON.stringify(options.development)},\n factories: { ${providers.factories} },\n hooks: {\n onAction: (event, storage) => nitroApp.hooks.callHook('files:action', { event, storage }),\n onError: (event, storage) => nitroApp.hooks.callHook('files:error', { event, storage }),\n onRetry: (event, storage) => nitroApp.hooks.callHook('files:retry', { event, storage }),\n },\n})\n`,\n ),\n // Older v2 and current v3 omit meta; only v3 exposes the routing API.\n writeFile(\n typesPath,\n storageTypes(configPath, nitro.meta?.majorVersion ?? ('routing' in nitro ? 3 : 2), single),\n ),\n ])\n types.tsConfig?.include?.push(typesPath)\n })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"nitro.js","names":[],"sources":["../../src/integration/nitro.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from 'node:fs/promises'\nimport { resolve } from 'node:path'\n\nimport type { ProviderSlug } from 'files-sdk'\nimport { getProvider } from 'files-sdk/providers'\nimport { createJiti } from 'jiti'\n\nimport type { StorageConfig } from '../config'\n\nexport interface NitroIntegration {\n meta?: { majorVersion?: number }\n options: {\n rootDir: string\n buildDir: string\n dev?: boolean\n plugins: string[]\n alias?: Record<string, string>\n externals?: { inline?: unknown[] }\n }\n unimport?: {\n injectImports(code: string, id?: string): Promise<{ code: string }>\n getInternalContext(): {\n addons: {\n name?: string\n declaration?: (declarations: string) => string\n }[]\n }\n }\n hooks: {\n hook(\n name: 'types:extend',\n callback: (types: {\n tsConfig?: {\n include?: string[]\n compilerOptions?: { paths?: Record<string, string[]> }\n }\n }) => void | Promise<void>,\n ): void\n }\n}\n\nexport interface NitroFilesIntegrationOptions {\n configPath: string\n development: boolean\n}\n\nconst isStorageConfig = (value: unknown): value is StorageConfig =>\n Boolean(value && typeof value === 'object' && 'adapter' in value && typeof value.adapter === 'string')\nconst isStorageRecord = (value: unknown): value is Record<string, StorageConfig> =>\n Boolean(value && typeof value === 'object' && Object.values(value).every(isStorageConfig))\n\nexport const selectedAdapters = (\n config: unknown,\n development: boolean,\n): { adapters: ProviderSlug[]; single: boolean } | undefined => {\n if (!config || typeof config !== 'object') {\n throw new Error('[nuxt-files-sdk:invalid-config] Files configuration must be an object.')\n }\n const typedConfig: { storage?: unknown; devStorage?: unknown } = config\n const storage = typedConfig.storage\n const devStorage = typedConfig.devStorage\n if (!storage && !development) return undefined\n if (!storage && !devStorage) {\n throw new Error('[nuxt-files-sdk:invalid-config] At least one storage is required.')\n }\n const selected: StorageConfig[] = []\n const single = isStorageConfig(storage ?? devStorage)\n if (!storage) {\n if (isStorageConfig(devStorage)) selected.push(devStorage)\n else if (isStorageRecord(devStorage) && Object.keys(devStorage).length > 0)\n selected.push(...Object.values(devStorage))\n else throw new Error('[nuxt-files-sdk:invalid-config] At least one development storage is required.')\n } else if (!isStorageConfig(storage) && (!isStorageRecord(storage) || Object.keys(storage).length === 0)) {\n throw new Error('[nuxt-files-sdk:invalid-config] At least one storage is required.')\n } else if (isStorageConfig(storage)) {\n if (devStorage && !isStorageConfig(devStorage)) {\n throw new Error('[nuxt-files-sdk:invalid-config] A single storage requires a single devStorage override.')\n }\n selected.push(development && isStorageConfig(devStorage) ? devStorage : storage)\n } else {\n if (devStorage && !isStorageRecord(devStorage)) {\n throw new Error('[nuxt-files-sdk:invalid-config] Named storage requires named devStorage overrides.')\n }\n const overrides = isStorageRecord(devStorage) ? devStorage : undefined\n for (const name of Object.keys(overrides ?? {})) {\n if (!Object.hasOwn(storage, name)) {\n throw new Error(`[nuxt-files-sdk:unknown-storage] Unknown storage \"${name}\".`)\n }\n }\n for (const [name, namedStorage] of Object.entries(storage)) {\n selected.push(development ? (overrides?.[name] ?? namedStorage) : namedStorage)\n }\n }\n const adapters = [...new Set(selected.map(({ adapter }) => adapter))].toSorted()\n for (const adapter of adapters) {\n if (!getProvider(adapter)) {\n throw new Error(`[nuxt-files-sdk:unknown-adapter] Unknown adapter \"${adapter}\".`)\n }\n }\n return { adapters, single }\n}\n\nconst factoryName = (adapter: ProviderSlug): string =>\n adapter === 'cloudinary'\n ? 'cloudinaryAdapter'\n : adapter.replaceAll(/-([a-z0-9])/gu, (_, character: string) => character.toUpperCase())\n\nexport const providerCode = (adapters: ProviderSlug[]): { imports: string; factories: string } => ({\n imports: adapters\n .map(\n (adapter, index) =>\n `import { ${factoryName(adapter)} as provider${index} } from ${JSON.stringify(`files-sdk/${adapter}`)}`,\n )\n .join('\\n'),\n factories: adapters.map((adapter, index) => `${JSON.stringify(adapter)}: provider${index}`).join(', '),\n})\n\nconst hookTypes = (moduleName: 'nitropack/types' | 'nitro/types'): string => `\ndeclare module ${JSON.stringify(moduleName)} {\n interface NitroRuntimeHooks {\n 'files:action': (payload: { event: import('files-sdk').FilesActionEvent; storage?: string }) => void | Promise<void>\n 'files:error': (payload: { event: import('files-sdk').FilesErrorEvent; storage?: string }) => void | Promise<void>\n 'files:retry': (payload: { event: import('files-sdk').FilesRetryEvent; storage?: string }) => void | Promise<void>\n }\n}\n`\n\nexport const storageTypes = (\n configPath: string,\n nitroMajor: number,\n single: boolean,\n): string => `import type config from ${JSON.stringify(configPath)}\nimport type { SingleStorage, StorageRegistry } from 'nuxt-files-sdk/runtime'\n\ndeclare module 'nuxt-files-sdk/runtime' {\n ${single ? 'interface NuxtFilesSingleStorage { value: SingleStorage<typeof config> }' : 'interface NuxtFilesStorageRegistry extends StorageRegistry<typeof config> {}'}\n}\n${hookTypes(nitroMajor >= 3 ? 'nitro/types' : 'nitropack/types')}\nexport {}\n`\n\nexport const setupNitroFilesIntegration = async (\n nitro: NitroIntegration,\n options: NitroFilesIntegrationOptions,\n): Promise<void> => {\n const configPath = options.configPath.replaceAll('\\\\', '/')\n const jiti = createJiti(import.meta.url, {\n ...(nitro.options.alias ? { alias: nitro.options.alias } : {}),\n interopDefault: true,\n moduleCache: false,\n })\n const source = await readFile(configPath, 'utf8')\n const code = nitro.unimport ? (await nitro.unimport.injectImports(source, configPath)).code : source\n const loaded: unknown = await jiti.evalModule(code, { filename: configPath, async: true })\n const config: unknown = loaded && typeof loaded === 'object' && 'default' in loaded ? loaded.default : loaded\n const selected = selectedAdapters(config, options.development)\n if (!selected) return\n const { adapters, single } = selected\n const providers = providerCode(adapters)\n const runtimeConfig = options.development ? 'config' : '{ storage: config.storage }'\n nitro.unimport?.getInternalContext().addons.push({\n name: 'nuxt-files-sdk-jsdoc',\n declaration: (declarations) =>\n declarations.replace(\n /^(\\s*)(const useServerFiles: typeof .*\\.useServerFiles)$/mu,\n \"$1/** Return the project's Files client, including its configured plugin extensions. */\\n$1const useServerFiles: typeof import('nuxt-files-sdk/runtime').useServerFiles\",\n ),\n })\n // Inline both packages so installed consumers also tree-shake the plugin barrel.\n const externals = (nitro.options.externals ??= {})\n ;(externals.inline ??= []).push('nuxt-files-sdk')\n // Nitro's single-file dev build would eagerly import every native provider SDK.\n if (!nitro.options.dev) externals.inline.push('files-sdk')\n const directory = resolve(nitro.options.buildDir, 'nuxt-files-sdk')\n const pluginPath = resolve(directory, options.development ? 'plugin.dev.mjs' : 'plugin.mjs')\n const typesPath = resolve(directory, 'storage-registry.d.ts')\n const filesSdkTypes = resolve(nitro.options.rootDir, 'node_modules/files-sdk/dist').replaceAll('\\\\', '/')\n // Development also externalizes local .mjs files unless explicitly inlined.\n externals.inline.push(pluginPath.replaceAll('\\\\', '/'), configPath)\n nitro.options.plugins.push(pluginPath.replaceAll('\\\\', '/'))\n nitro.hooks.hook('types:extend', async (types) => {\n await mkdir(directory, { recursive: true })\n await Promise.all([\n writeFile(\n pluginPath,\n `import config from ${JSON.stringify(configPath)}\n${providers.imports}\nimport { configureFiles } from 'nuxt-files-sdk/runtime'\n\nexport default (nitroApp) => configureFiles(${runtimeConfig}, {\n development: ${JSON.stringify(options.development)},\n factories: { ${providers.factories} },\n hooks: {\n onAction: (event, storage) => nitroApp.hooks.callHook('files:action', { event, storage }),\n onError: (event, storage) => nitroApp.hooks.callHook('files:error', { event, storage }),\n onRetry: (event, storage) => nitroApp.hooks.callHook('files:retry', { event, storage }),\n },\n})\n`,\n ),\n // Older v2 and current v3 omit meta; only v3 exposes the routing API.\n writeFile(\n typesPath,\n storageTypes(configPath, nitro.meta?.majorVersion ?? ('routing' in nitro ? 3 : 2), single),\n ),\n ])\n const tsConfig = (types.tsConfig ??= {})\n ;(tsConfig.include ??= []).push(typesPath)\n const paths = ((tsConfig.compilerOptions ??= {}).paths ??= {})\n paths['files-sdk'] ??= [`${filesSdkTypes}/index.d.ts`]\n paths['files-sdk/*'] ??= [`${filesSdkTypes}/*/index.d.ts`]\n })\n}\n"],"mappings":"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"}
package/dist/module.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { FilesDevtoolsOptions } from "./devtools/enabled.js";
1
2
  import { NitroIntegration } from "./integration/nitro.js";
2
3
  import { FilesForStorage, FilesProviderFactories, FilesProviderFactory, FilesRegistry, FilesRuntimeHooks, SingleStorage, StorageRegistry } from "./runtime/registry.js";
3
4
  import { NuxtFilesSingleStorage, NuxtFilesStorageRegistry, configureFiles, inspectFiles, useServerFiles } from "./runtime.js";
@@ -12,11 +13,11 @@ declare module '@nuxt/schema' {
12
13
  export interface ModuleOptions {
13
14
  /** Path to the Files configuration module, relative to the Nuxt root directory. */
14
15
  config: string;
15
- /** Enable Files SDK development diagnostics when Nuxt DevTools is available. */
16
- devtools: boolean;
16
+ /** Enable Files SDK development tools. File writes are enabled unless explicitly disabled. */
17
+ devtools: boolean | FilesDevtoolsOptions;
17
18
  }
18
19
  /** Install Files SDK storage configuration, server utilities, Vue composables, and development diagnostics in Nuxt. */
19
20
  declare const _default: import("@nuxt/schema").NuxtModule<ModuleOptions, ModuleOptions, false>;
20
21
  //#endregion
21
- export { type FilesForStorage, type FilesProviderFactories, type FilesProviderFactory, FilesRegistry, type FilesRuntimeHooks, NuxtFilesSingleStorage, NuxtFilesStorageRegistry, type SingleStorage, type StorageRegistry, configureFiles, _default as default, inspectFiles, useServerFiles };
22
+ export { type FilesDevtoolsOptions, type FilesForStorage, type FilesProviderFactories, type FilesProviderFactory, FilesRegistry, type FilesRuntimeHooks, NuxtFilesSingleStorage, NuxtFilesStorageRegistry, type SingleStorage, type StorageRegistry, configureFiles, _default as default, inspectFiles, useServerFiles };
22
23
  //# sourceMappingURL=module.d.ts.map