nuxt-files-sdk 0.0.5 → 0.1.1

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 (62) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +35 -9
  3. package/dist/config/load.js +67 -0
  4. package/dist/config/load.js.map +1 -0
  5. package/dist/config/merge.d.ts +5 -0
  6. package/dist/config/merge.js +22 -0
  7. package/dist/config/merge.js.map +1 -0
  8. package/dist/config/prune.js +57 -0
  9. package/dist/config/prune.js.map +1 -0
  10. package/dist/config.d.ts +101 -103
  11. package/dist/config.js +2 -2
  12. package/dist/config.js.map +1 -1
  13. package/dist/devtools/auth.js +49 -0
  14. package/dist/devtools/auth.js.map +1 -0
  15. package/dist/devtools/client/app.js +6 -4
  16. package/dist/devtools/client/browser-agent-rpc-BXhoSh1z-DRoP5jHQ.js +1 -0
  17. package/dist/devtools/client/index.html +4 -1
  18. package/dist/devtools/devframe.js +7 -1
  19. package/dist/devtools/devframe.js.map +1 -1
  20. package/dist/devtools/diagnostics.d.ts +1 -1
  21. package/dist/devtools/diagnostics.js +1 -1
  22. package/dist/devtools/diagnostics.js.map +1 -1
  23. package/dist/devtools/files-read.d.ts +1 -1
  24. package/dist/devtools/files-write.d.ts +1 -1
  25. package/dist/devtools/files.js +7 -4
  26. package/dist/devtools/files.js.map +1 -1
  27. package/dist/devtools/index.js +24 -6
  28. package/dist/devtools/index.js.map +1 -1
  29. package/dist/devtools/nuxt-v3-handler.js +1 -1
  30. package/dist/devtools/nuxt-v3-handler.js.map +1 -1
  31. package/dist/devtools/nuxt-v3.js +1 -1
  32. package/dist/devtools/nuxt-v3.js.map +1 -1
  33. package/dist/devtools/nuxt-v4.js.map +1 -1
  34. package/dist/devtools/snapshot.d.ts +8 -2
  35. package/dist/devtools/snapshot.js +13 -3
  36. package/dist/devtools/snapshot.js.map +1 -1
  37. package/dist/devtools/token.d.ts +14 -0
  38. package/dist/devtools/token.js +17 -0
  39. package/dist/devtools/token.js.map +1 -0
  40. package/dist/integration/nitro.d.ts +6 -0
  41. package/dist/integration/nitro.js +160 -63
  42. package/dist/integration/nitro.js.map +1 -1
  43. package/dist/module.d.ts +1 -4
  44. package/dist/module.js +31 -20
  45. package/dist/module.js.map +1 -1
  46. package/dist/nitro.d.ts +2 -4
  47. package/dist/nitro.js +2 -4
  48. package/dist/nitro.js.map +1 -1
  49. package/dist/package.js +1 -1
  50. package/dist/runtime/internal.d.ts +11 -0
  51. package/dist/runtime/internal.js +30 -0
  52. package/dist/runtime/internal.js.map +1 -0
  53. package/dist/runtime/normalize.js +29 -0
  54. package/dist/runtime/normalize.js.map +1 -0
  55. package/dist/runtime/provider-types.d.ts +53 -0
  56. package/dist/runtime/registry.d.ts +55 -8
  57. package/dist/runtime/registry.js +125 -89
  58. package/dist/runtime/registry.js.map +1 -1
  59. package/dist/runtime.d.ts +8 -9
  60. package/dist/runtime.js +8 -25
  61. package/dist/runtime.js.map +1 -1
  62. package/package.json +26 -15
@@ -1 +1 @@
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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"}
1
+ {"version":3,"file":"nitro.js","names":[],"sources":["../../src/integration/nitro.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from 'node:fs/promises'\nimport { createRequire } from 'node:module'\nimport { resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport type { ProviderSlug } from 'files-sdk'\nimport { getProvider, listEnvVars } from 'files-sdk/providers'\n\nimport { loadFilesConfig } from '../config/load'\nimport { pruneFilesConfigSource } from '../config/prune'\nimport { normalizeFilesConfig } from '../runtime/normalize'\n\nexport interface NitroIntegration {\n meta?: { majorVersion?: number }\n options: {\n rootDir: string\n buildDir: string\n dev?: boolean\n static?: boolean\n preset?: string\n plugins: string[]\n handlers?: { route: string; handler: 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 environments: readonly string[]\n}\n\nconst AWS_CORE_DEPENDENCIES = [\n '@aws-sdk/client-s3',\n '@aws-sdk/s3-presigned-post',\n '@aws-sdk/s3-request-presigner',\n] as const\nconst AWS_MULTIPART_DEPENDENCY = '@aws-sdk/lib-storage'\nconst FETCH_CAPABLE_S3_ADAPTERS = new Set<ProviderSlug>(['minio', 'r2', 'rustfs'])\nconst WORKERD_PRESETS = new Set(['cloudflare-module', 'cloudflare-durable', 'cloudflare-pages'])\n\nexport const optionalAwsSdkDependencies = (\n adapters: ProviderSlug[],\n options: { nitroMajor: number; preset?: string | undefined; resolvable: (dependency: string) => boolean },\n): string[] => {\n if (options.nitroMajor >= 3 || !options.preset || !WORKERD_PRESETS.has(options.preset)) return []\n const s3Adapters = adapters.filter((adapter) => getProvider(adapter)?.peerDeps.includes('@aws-sdk/client-s3'))\n if (s3Adapters.length === 0) return []\n const optional = s3Adapters.every((adapter) => FETCH_CAPABLE_S3_ADAPTERS.has(adapter))\n ? [...AWS_CORE_DEPENDENCIES, AWS_MULTIPART_DEPENDENCY]\n : [AWS_MULTIPART_DEPENDENCY]\n return optional.filter((dependency) => !options.resolvable(dependency))\n}\n\nconst nitroMajorVersion = (nitro: NitroIntegration): number => nitro.meta?.majorVersion ?? ('routing' in nitro ? 3 : 2)\n\nexport const selectedAdapters = (config: unknown): { adapters: ProviderSlug[]; single: boolean } => {\n const entries = normalizeFilesConfig(config)\n const single = entries.has(undefined)\n const adapters = [\n ...new Set(\n [...entries.values()]\n .map(({ storage }) => storage.adapter)\n .filter((adapter): adapter is ProviderSlug => typeof adapter === 'string'),\n ),\n ].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\nexport const gatewayRoutes = (config: unknown): { path: string; storage?: string }[] => {\n const routes = config && typeof config === 'object' && 'routes' in config ? config.routes : undefined\n if (routes === undefined) return []\n if (!Array.isArray(routes)) throw new Error('[nuxt-files-sdk:invalid-route] routes must be an array.')\n const storages = normalizeFilesConfig(config)\n const paths = new Set<string>()\n const selected: { path: string; storage?: string }[] = []\n for (const route of routes as unknown[]) {\n if (\n !route ||\n typeof route !== 'object' ||\n !('path' in route) ||\n typeof route.path !== 'string' ||\n !/^\\/(?:[\\w.~-]+(?:\\/[\\w.~-]+)*)?$/u.test(route.path)\n ) {\n throw new Error('[nuxt-files-sdk:invalid-route] Each route needs a static absolute path.')\n }\n if (paths.has(route.path)) throw new Error(`[nuxt-files-sdk:duplicate-route] Duplicate route \"${route.path}\".`)\n paths.add(route.path)\n const name = 'storage' in route ? route.storage : undefined\n if (storages.has(undefined) ? name !== undefined : typeof name !== 'string' || !storages.has(name)) {\n throw new Error(`[nuxt-files-sdk:unknown-storage] Invalid storage for route \"${route.path}\".`)\n }\n selected.push(typeof name === 'string' ? { path: route.path, storage: name } : { path: route.path })\n }\n return selected\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): 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 interface NuxtFilesSingleStorage { value: SingleStorage<typeof config> }\n 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<boolean> => {\n const configPath = options.configPath.replaceAll('\\\\', '/')\n const config = await loadFilesConfig({\n configPath,\n environments: options.environments,\n alias: nitro.options.alias,\n injectImports: nitro.unimport?.injectImports.bind(nitro.unimport),\n })\n if (!config) return false\n const selected = selectedAdapters(config)\n const directory = resolve(nitro.options.rootDir, nitro.options.buildDir, 'nuxt-files-sdk')\n const typesPath = resolve(directory, 'storage-registry.d.ts')\n let writeRuntime: (() => Promise<void>) | undefined\n const writeTypes = async (): Promise<void> => {\n await mkdir(directory, { recursive: true })\n await writeFile(typesPath, storageTypes(configPath, nitroMajorVersion(nitro)))\n }\n await writeTypes()\n nitro.hooks.hook('types:extend', async (types) => {\n await writeTypes()\n await writeRuntime?.()\n const tsConfig = (types.tsConfig ??= {})\n ;(tsConfig.include ??= []).push(typesPath)\n const paths = ((tsConfig.compilerOptions ??= {}).paths ??= {})\n paths['files-sdk'] ??= [resolve(nitro.options.rootDir, 'node_modules/files-sdk').replaceAll('\\\\', '/')]\n })\n const routes = gatewayRoutes(config)\n const { adapters } = selected\n const providers = providerCode(adapters)\n const internalPath = fileURLToPath(new URL('../runtime/internal.js', import.meta.url)).replaceAll('\\\\', '/')\n const environment = Object.fromEntries(\n adapters.map((adapter) => [\n adapter,\n listEnvVars(adapter)\n .filter((variable) => variable.readBy === 'files-sdk')\n .map((variable) => [variable.key, ...(variable.aliases ?? [])]),\n ]),\n )\n const require = createRequire(resolve(nitro.options.rootDir, 'package.json'))\n const aliases = nitro.options.alias ?? {}\n const awsShims = optionalAwsSdkDependencies(adapters, {\n nitroMajor: nitroMajorVersion(nitro),\n preset: nitro.options.preset,\n resolvable: (dependency) => {\n if (Object.hasOwn(aliases, dependency)) return true\n try {\n require.resolve(dependency)\n return true\n } catch {\n return false\n }\n },\n })\n const shimFiles = awsShims.map((dependency) => ({\n dependency,\n path: resolve(directory, `${dependency.replaceAll(/[^a-z0-9]+/giu, '-')}.mjs`),\n }))\n if (shimFiles.length > 0) {\n nitro.options.alias = aliases\n for (const { dependency, path } of shimFiles) aliases[dependency] = path.replaceAll('\\\\', '/')\n }\n nitro.unimport?.getInternalContext().addons.push({\n name: 'nuxt-files-sdk-jsdoc',\n declaration: (declarations) =>\n declarations.replace(\n /^([ \\t]*)const (defineFilesConfig|useServerFiles|syncFiles|transferFiles): typeof .*\\.\\2$/gmu,\n (_, indent: string, name: string) =>\n `${name === 'useServerFiles' ? `${indent}/** Return the project's Files client, including its configured plugin extensions. */\\n` : ''}${indent}const ${name}: typeof import('nuxt-files-sdk/${name === 'defineFilesConfig' ? 'config' : 'runtime'}').${name}`,\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 pluginPath = resolve(directory, nitro.options.dev ? 'plugin.dev.mjs' : 'plugin.mjs')\n const resolvedPath = resolve(directory, nitro.options.dev ? 'resolved.dev.mjs' : 'resolved.mjs')\n const selectedPath = resolve(directory, nitro.options.dev ? 'selected.dev.ts' : 'selected.ts')\n const routePaths = routes.map((_, index) =>\n resolve(directory, `gateway-${index}${nitro.options.dev ? '.dev' : ''}.mjs`).replaceAll('\\\\', '/'),\n )\n for (const [index, route] of routes.entries()) {\n ;(nitro.options.handlers ??= []).push({ route: route.path, handler: routePaths[index]! })\n }\n // Development also externalizes local .mjs files unless explicitly inlined.\n externals.inline.push(\n pluginPath.replaceAll('\\\\', '/'),\n resolvedPath.replaceAll('\\\\', '/'),\n selectedPath.replaceAll('\\\\', '/'),\n ...routePaths,\n )\n nitro.options.plugins.push(pluginPath.replaceAll('\\\\', '/'))\n writeRuntime = async (): Promise<void> => {\n await mkdir(directory, { recursive: true })\n await Promise.all(\n shimFiles.map(({ dependency, path }) =>\n writeFile(\n path,\n `throw new Error(${JSON.stringify(`[nuxt-files-sdk:missing-optional-dependency] ${dependency} is required for this Files SDK operation. Install it or select the provider's fetch client.`)})\\n`,\n ),\n ),\n )\n const originalSource = await readFile(configPath, 'utf8')\n const importedSource = nitro.unimport\n ? (await nitro.unimport.injectImports(originalSource, configPath)).code\n : originalSource\n await writeFile(selectedPath, pruneFilesConfigSource(importedSource, configPath, options.environments))\n const mergePath = fileURLToPath(new URL('../config/merge.js', import.meta.url)).replaceAll('\\\\', '/')\n const selectedBranches = options.environments\n .flatMap((name) => [`raw[${JSON.stringify(`$${name}`)}]`, `raw.$env?.[${JSON.stringify(name)}]`])\n .toReversed()\n await writeFile(\n resolvedPath,\n `import raw from ${JSON.stringify(selectedPath.replaceAll('\\\\', '/'))}\\nimport { mergeFilesConfig } from ${JSON.stringify(mergePath)}\\nconst resolved = mergeFilesConfig(${[...selectedBranches, 'raw'].join(', ')})\\nexport default { storage: resolved.storage, routes: resolved.routes }\\n`,\n )\n await writeFile(\n pluginPath,\n `import config from ${JSON.stringify(resolvedPath.replaceAll('\\\\', '/'))}\n${providers.imports}\nimport { configureFiles } from ${JSON.stringify(internalPath)}\n\nexport default (nitroApp) => configureFiles(config, {\n factories: { ${providers.factories} },\n environment: ${JSON.stringify(environment)},\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 await Promise.all(\n routePaths.map((path, index) => {\n const route = routes[index]!\n const handler =\n nitroMajorVersion(nitro) >= 3 ? 'router.handle(event.req)' : 'createRouteHandler(router)(event)'\n return writeFile(\n path,\n `import config from ${JSON.stringify(resolvedPath.replaceAll('\\\\', '/'))}\nimport { createFilesRouter } from 'files-sdk/api'\n${nitroMajorVersion(nitro) >= 3 ? '' : \"import { createRouteHandler } from 'files-sdk/nitro'\"}\nimport { getFiles } from ${JSON.stringify(internalPath)}\n\nconst route = config.routes[${index}]\nconst environmentSecret = typeof process === 'undefined' ? undefined : process.env?.FILES_API_SECRET\nconst secret = route.authorize\n ? route.secret || environmentSecret || crypto.randomUUID() + crypto.randomUUID()\n : route.secret\nif (route.authorize && !route.secret && !environmentSecret) {\n console.warn('[nuxt-files-sdk:gateway-secret] Set FILES_API_SECRET for upload tokens shared across processes.')\n}\nlet sharedRouter\nconst makeRouter = (event) => createFilesRouter({\n ...route,\n files: () => getFiles(${route.storage === undefined ? '' : JSON.stringify(route.storage)}),\n secret,\n authorize: route.authorize && ((context) => route.authorize({ ...context, event })),\n})\nexport default (event) => {\n const router = route.authorize ? makeRouter(event) : (sharedRouter ??= makeRouter(event))\n return ${handler}\n}\n`,\n )\n }),\n )\n }\n await writeRuntime()\n return true\n}\n"],"mappings":"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"}
package/dist/module.d.ts CHANGED
@@ -1,8 +1,5 @@
1
1
  import { FilesDevtoolsOptions } from "./devtools/enabled.js";
2
2
  import { NitroIntegration } from "./integration/nitro.js";
3
- import { FilesForStorage, FilesProviderFactories, FilesProviderFactory, FilesRegistry, FilesRuntimeHooks, SingleStorage, StorageRegistry } from "./runtime/registry.js";
4
- import { NuxtFilesSingleStorage, NuxtFilesStorageRegistry, configureFiles, inspectFiles, useServerFiles } from "./runtime.js";
5
- export * from "files-sdk";
6
3
  //#region src/module.d.ts
7
4
  declare module '@nuxt/schema' {
8
5
  interface NuxtHooks {
@@ -19,5 +16,5 @@ export interface ModuleOptions {
19
16
  /** Install Files SDK storage configuration, server utilities, Vue composables, and development diagnostics in Nuxt. */
20
17
  declare const _default: import("@nuxt/schema").NuxtModule<ModuleOptions, ModuleOptions, false>;
21
18
  //#endregion
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 };
19
+ export { type FilesDevtoolsOptions, _default as default };
23
20
  //# sourceMappingURL=module.d.ts.map
package/dist/module.js CHANGED
@@ -1,10 +1,8 @@
1
1
  import { filesDevtoolsWriteEnabled, shouldEnableFilesDevtools } from "./devtools/enabled.js";
2
2
  import { setupNitroFilesIntegration } from "./integration/nitro.js";
3
- import { FilesRegistry } from "./runtime/registry.js";
4
- import { configureFiles, inspectFiles, useServerFiles } from "./runtime.js";
3
+ import { randomUUID } from "node:crypto";
5
4
  import { resolve } from "node:path";
6
5
  import { addImports, addServerImports, defineNuxtModule, getNuxtModuleVersion } from "@nuxt/kit";
7
- export * from "files-sdk";
8
6
  //#region src/module.ts
9
7
  /** Install Files SDK storage configuration, server utilities, Vue composables, and development diagnostics in Nuxt. */
10
8
  var module_default = defineNuxtModule({
@@ -20,24 +18,36 @@ var module_default = defineNuxtModule({
20
18
  async setup(options, nuxt) {
21
19
  const configPath = resolve(nuxt.options.rootDir, options.config);
22
20
  (nuxt.options.typescript.tsConfig.include ??= []).push(configPath);
23
- const filesSdkTypes = resolve(nuxt.options.rootDir, "node_modules/files-sdk/dist").replaceAll("\\", "/");
24
21
  const paths = (nuxt.options.typescript.tsConfig.compilerOptions ??= {}).paths ??= {};
25
- paths["files-sdk"] ??= [`${filesSdkTypes}/index.d.ts`];
26
- paths["files-sdk/*"] ??= [`${filesSdkTypes}/*/index.d.ts`];
27
- nuxt.hook("nitro:init", (nitro) => setupNitroFilesIntegration(nitro, {
28
- configPath,
29
- development: nuxt.options.dev
30
- }));
22
+ paths["files-sdk"] ??= [resolve(nuxt.options.rootDir, "node_modules/files-sdk").replaceAll("\\", "/")];
23
+ let active = false;
24
+ nuxt.hook("nitro:init", async (nitro) => {
25
+ active = await setupNitroFilesIntegration(nitro, {
26
+ configPath,
27
+ environments: nitro.options.static ? ["production", "prerender"] : [nuxt.options.envName || (nuxt.options.dev ? "development" : "production")]
28
+ });
29
+ });
31
30
  nuxt.hook("prepare:types", ({ references }) => {
32
- references.push({ path: resolve(nuxt.options.buildDir, "nuxt-files-sdk/storage-registry.d.ts") });
31
+ if (active) references.push({ path: resolve(nuxt.options.buildDir, "nuxt-files-sdk/storage-registry.d.ts") });
33
32
  });
34
- addServerImports([{
35
- name: "defineFilesConfig",
36
- from: "nuxt-files-sdk/config"
37
- }, {
38
- name: "useServerFiles",
39
- from: "nuxt-files-sdk/runtime"
40
- }]);
33
+ addServerImports([
34
+ {
35
+ name: "defineFilesConfig",
36
+ from: "nuxt-files-sdk/config"
37
+ },
38
+ {
39
+ name: "useServerFiles",
40
+ from: "nuxt-files-sdk/runtime"
41
+ },
42
+ {
43
+ name: "syncFiles",
44
+ from: "nuxt-files-sdk/runtime"
45
+ },
46
+ {
47
+ name: "transferFiles",
48
+ from: "nuxt-files-sdk/runtime"
49
+ }
50
+ ]);
41
51
  addImports({
42
52
  name: "defineFilesConfig",
43
53
  from: "nuxt-files-sdk/config"
@@ -54,11 +64,12 @@ var module_default = defineNuxtModule({
54
64
  if (shouldEnableFilesDevtools(nuxt.options.dev, options.devtools, nuxt.options.devtools)) {
55
65
  const version = await getNuxtModuleVersion("@nuxt/devtools", nuxt);
56
66
  const { setupFilesDevtools } = await import("./devtools/index.js");
57
- setupFilesDevtools(nuxt, version || "3", filesDevtoolsWriteEnabled(options.devtools));
67
+ const secrets = { token: randomUUID() };
68
+ setupFilesDevtools(nuxt, version || "3", filesDevtoolsWriteEnabled(options.devtools), secrets);
58
69
  }
59
70
  }
60
71
  });
61
72
  //#endregion
62
- export { FilesRegistry, configureFiles, module_default as default, inspectFiles, useServerFiles };
73
+ export { module_default as default };
63
74
 
64
75
  //# sourceMappingURL=module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","names":[],"sources":["../src/module.ts"],"sourcesContent":["import { resolve } from 'node:path'\n\nimport { addImports, addServerImports, defineNuxtModule, getNuxtModuleVersion } from '@nuxt/kit'\nimport type { Nuxt } from '@nuxt/schema'\n\nimport { filesDevtoolsWriteEnabled, shouldEnableFilesDevtools, type FilesDevtoolsOptions } from './devtools/enabled'\nimport { setupNitroFilesIntegration, type NitroIntegration } from './integration/nitro'\n\ndeclare module '@nuxt/schema' {\n interface NuxtHooks {\n 'nitro:init': (nitro: NitroIntegration) => void | Promise<void>\n }\n}\n\n/** Options for the Nuxt Files SDK module. */\nexport interface ModuleOptions {\n /** Path to the Files configuration module, relative to the Nuxt root directory. */\n config: string\n /** Enable Files SDK development tools. File writes are enabled unless explicitly disabled. */\n devtools: boolean | FilesDevtoolsOptions\n}\n\n/** Install Files SDK storage configuration, server utilities, Vue composables, and development diagnostics in Nuxt. */\nexport default defineNuxtModule<ModuleOptions>({\n meta: {\n name: 'nuxt-files-sdk',\n configKey: 'files',\n compatibility: { nuxt: '^4.0.0 || ^5.0.0' },\n },\n defaults: {\n config: 'files.config.ts',\n devtools: true,\n },\n async setup(options, nuxt: Nuxt) {\n const configPath = resolve(nuxt.options.rootDir, options.config)\n ;(nuxt.options.typescript.tsConfig.include ??= []).push(configPath)\n const filesSdkTypes = resolve(nuxt.options.rootDir, 'node_modules/files-sdk/dist').replaceAll('\\\\', '/')\n const paths = ((nuxt.options.typescript.tsConfig.compilerOptions ??= {}).paths ??= {})\n paths['files-sdk'] ??= [`${filesSdkTypes}/index.d.ts`]\n paths['files-sdk/*'] ??= [`${filesSdkTypes}/*/index.d.ts`]\n nuxt.hook('nitro:init', (nitro) =>\n setupNitroFilesIntegration(nitro, {\n configPath,\n development: nuxt.options.dev,\n }),\n )\n nuxt.hook('prepare:types', ({ references }) => {\n references.push({ path: resolve(nuxt.options.buildDir, 'nuxt-files-sdk/storage-registry.d.ts') })\n })\n\n addServerImports([\n { name: 'defineFilesConfig', from: 'nuxt-files-sdk/config' },\n { name: 'useServerFiles', from: 'nuxt-files-sdk/runtime' },\n ])\n addImports({ name: 'defineFilesConfig', from: 'nuxt-files-sdk/config' })\n for (const name of ['useFiles', 'useFile', 'useList', 'useSearch']) {\n addImports({ name, from: 'files-sdk/vue' })\n }\n\n if (shouldEnableFilesDevtools(nuxt.options.dev, options.devtools, nuxt.options.devtools)) {\n const version = await getNuxtModuleVersion('@nuxt/devtools', nuxt)\n const { setupFilesDevtools } = await import('./devtools')\n setupFilesDevtools(nuxt, version || '3', filesDevtoolsWriteEnabled(options.devtools))\n }\n },\n})\n\nexport type { FilesDevtoolsOptions } from './devtools/enabled'\nexport * from 'files-sdk'\nexport * from './runtime'\n"],"mappings":";;;;;;;;;AAuBA,IAAA,iBAAe,iBAAgC;CAC3C,MAAM;EACF,MAAM;EACN,WAAW;EACX,eAAe,EAAE,MAAM,mBAAmB;CAC9C;CACA,UAAU;EACN,QAAQ;EACR,UAAU;CACd;CACA,MAAM,MAAM,SAAS,MAAY;EAC7B,MAAM,aAAa,QAAQ,KAAK,QAAQ,SAAS,QAAQ,MAAM;EAC9D,CAAC,KAAK,QAAQ,WAAW,SAAS,YAAY,CAAC,EAAA,CAAG,KAAK,UAAU;EAClE,MAAM,gBAAgB,QAAQ,KAAK,QAAQ,SAAS,6BAA6B,CAAC,CAAC,WAAW,MAAM,GAAG;EACvG,MAAM,QAAS,CAAC,KAAK,QAAQ,WAAW,SAAS,oBAAoB,CAAC,EAAA,CAAG,UAAU,CAAC;EACpF,MAAM,iBAAiB,CAAC,GAAG,cAAc,YAAY;EACrD,MAAM,mBAAmB,CAAC,GAAG,cAAc,cAAc;EACzD,KAAK,KAAK,eAAe,UACrB,2BAA2B,OAAO;GAC9B;GACA,aAAa,KAAK,QAAQ;EAC9B,CAAC,CACL;EACA,KAAK,KAAK,kBAAkB,EAAE,iBAAiB;GAC3C,WAAW,KAAK,EAAE,MAAM,QAAQ,KAAK,QAAQ,UAAU,sCAAsC,EAAE,CAAC;EACpG,CAAC;EAED,iBAAiB,CACb;GAAE,MAAM;GAAqB,MAAM;EAAwB,GAC3D;GAAE,MAAM;GAAkB,MAAM;EAAyB,CAC7D,CAAC;EACD,WAAW;GAAE,MAAM;GAAqB,MAAM;EAAwB,CAAC;EACvE,KAAK,MAAM,QAAQ;GAAC;GAAY;GAAW;GAAW;EAAW,GAC7D,WAAW;GAAE;GAAM,MAAM;EAAgB,CAAC;EAG9C,IAAI,0BAA0B,KAAK,QAAQ,KAAK,QAAQ,UAAU,KAAK,QAAQ,QAAQ,GAAG;GACtF,MAAM,UAAU,MAAM,qBAAqB,kBAAkB,IAAI;GACjE,MAAM,EAAE,uBAAuB,MAAM,OAAO;GAC5C,mBAAmB,MAAM,WAAW,KAAK,0BAA0B,QAAQ,QAAQ,CAAC;EACxF;CACJ;AACJ,CAAC"}
1
+ {"version":3,"file":"module.js","names":[],"sources":["../src/module.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto'\nimport { resolve } from 'node:path'\n\nimport { addImports, addServerImports, defineNuxtModule, getNuxtModuleVersion } from '@nuxt/kit'\nimport type { Nuxt } from '@nuxt/schema'\n\nimport { filesDevtoolsWriteEnabled, shouldEnableFilesDevtools, type FilesDevtoolsOptions } from './devtools/enabled'\nimport { setupNitroFilesIntegration, type NitroIntegration } from './integration/nitro'\n\ndeclare module '@nuxt/schema' {\n interface NuxtHooks {\n 'nitro:init': (nitro: NitroIntegration) => void | Promise<void>\n }\n}\n\n/** Options for the Nuxt Files SDK module. */\nexport interface ModuleOptions {\n /** Path to the Files configuration module, relative to the Nuxt root directory. */\n config: string\n /** Enable Files SDK development tools. File writes are enabled unless explicitly disabled. */\n devtools: boolean | FilesDevtoolsOptions\n}\n\n/** Install Files SDK storage configuration, server utilities, Vue composables, and development diagnostics in Nuxt. */\nexport default defineNuxtModule<ModuleOptions>({\n meta: {\n name: 'nuxt-files-sdk',\n configKey: 'files',\n compatibility: { nuxt: '^4.0.0 || ^5.0.0' },\n },\n defaults: {\n config: 'files.config.ts',\n devtools: true,\n },\n async setup(options, nuxt: Nuxt) {\n const configPath = resolve(nuxt.options.rootDir, options.config)\n ;(nuxt.options.typescript.tsConfig.include ??= []).push(configPath)\n const paths = ((nuxt.options.typescript.tsConfig.compilerOptions ??= {}).paths ??= {})\n paths['files-sdk'] ??= [resolve(nuxt.options.rootDir, 'node_modules/files-sdk').replaceAll('\\\\', '/')]\n let active = false\n nuxt.hook('nitro:init', async (nitro) => {\n active = await setupNitroFilesIntegration(nitro, {\n configPath,\n environments: nitro.options.static\n ? ['production', 'prerender']\n : [nuxt.options.envName || (nuxt.options.dev ? 'development' : 'production')],\n })\n })\n nuxt.hook('prepare:types', ({ references }) => {\n if (active)\n references.push({ path: resolve(nuxt.options.buildDir, 'nuxt-files-sdk/storage-registry.d.ts') })\n })\n\n addServerImports([\n { name: 'defineFilesConfig', from: 'nuxt-files-sdk/config' },\n { name: 'useServerFiles', from: 'nuxt-files-sdk/runtime' },\n { name: 'syncFiles', from: 'nuxt-files-sdk/runtime' },\n { name: 'transferFiles', from: 'nuxt-files-sdk/runtime' },\n ])\n addImports({ name: 'defineFilesConfig', from: 'nuxt-files-sdk/config' })\n for (const name of ['useFiles', 'useFile', 'useList', 'useSearch']) {\n addImports({ name, from: 'files-sdk/vue' })\n }\n\n if (shouldEnableFilesDevtools(nuxt.options.dev, options.devtools, nuxt.options.devtools)) {\n const version = await getNuxtModuleVersion('@nuxt/devtools', nuxt)\n const { setupFilesDevtools } = await import('./devtools')\n const secrets = { token: randomUUID() }\n setupFilesDevtools(nuxt, version || '3', filesDevtoolsWriteEnabled(options.devtools), secrets)\n }\n },\n})\n\nexport type { FilesDevtoolsOptions } from './devtools/enabled'\n"],"mappings":";;;;;;;AAwBA,IAAA,iBAAe,iBAAgC;CAC3C,MAAM;EACF,MAAM;EACN,WAAW;EACX,eAAe,EAAE,MAAM,mBAAmB;CAC9C;CACA,UAAU;EACN,QAAQ;EACR,UAAU;CACd;CACA,MAAM,MAAM,SAAS,MAAY;EAC7B,MAAM,aAAa,QAAQ,KAAK,QAAQ,SAAS,QAAQ,MAAM;EAC9D,CAAC,KAAK,QAAQ,WAAW,SAAS,YAAY,CAAC,EAAA,CAAG,KAAK,UAAU;EAClE,MAAM,QAAS,CAAC,KAAK,QAAQ,WAAW,SAAS,oBAAoB,CAAC,EAAA,CAAG,UAAU,CAAC;EACpF,MAAM,iBAAiB,CAAC,QAAQ,KAAK,QAAQ,SAAS,wBAAwB,CAAC,CAAC,WAAW,MAAM,GAAG,CAAC;EACrG,IAAI,SAAS;EACb,KAAK,KAAK,cAAc,OAAO,UAAU;GACrC,SAAS,MAAM,2BAA2B,OAAO;IAC7C;IACA,cAAc,MAAM,QAAQ,SACtB,CAAC,cAAc,WAAW,IAC1B,CAAC,KAAK,QAAQ,YAAY,KAAK,QAAQ,MAAM,gBAAgB,aAAa;GACpF,CAAC;EACL,CAAC;EACD,KAAK,KAAK,kBAAkB,EAAE,iBAAiB;GAC3C,IAAI,QACA,WAAW,KAAK,EAAE,MAAM,QAAQ,KAAK,QAAQ,UAAU,sCAAsC,EAAE,CAAC;EACxG,CAAC;EAED,iBAAiB;GACb;IAAE,MAAM;IAAqB,MAAM;GAAwB;GAC3D;IAAE,MAAM;IAAkB,MAAM;GAAyB;GACzD;IAAE,MAAM;IAAa,MAAM;GAAyB;GACpD;IAAE,MAAM;IAAiB,MAAM;GAAyB;EAC5D,CAAC;EACD,WAAW;GAAE,MAAM;GAAqB,MAAM;EAAwB,CAAC;EACvE,KAAK,MAAM,QAAQ;GAAC;GAAY;GAAW;GAAW;EAAW,GAC7D,WAAW;GAAE;GAAM,MAAM;EAAgB,CAAC;EAG9C,IAAI,0BAA0B,KAAK,QAAQ,KAAK,QAAQ,UAAU,KAAK,QAAQ,QAAQ,GAAG;GACtF,MAAM,UAAU,MAAM,qBAAqB,kBAAkB,IAAI;GACjE,MAAM,EAAE,uBAAuB,MAAM,OAAO;GAC5C,MAAM,UAAU,EAAE,OAAO,WAAW,EAAE;GACtC,mBAAmB,MAAM,WAAW,KAAK,0BAA0B,QAAQ,QAAQ,GAAG,OAAO;EACjG;CACJ;AACJ,CAAC"}
package/dist/nitro.d.ts CHANGED
@@ -1,6 +1,4 @@
1
1
  import { NitroIntegration } from "./integration/nitro.js";
2
- import { FilesForStorage, FilesProviderFactories, FilesProviderFactory, FilesRegistry, FilesRuntimeHooks, SingleStorage, StorageRegistry } from "./runtime/registry.js";
3
- import { NuxtFilesSingleStorage, NuxtFilesStorageRegistry, configureFiles, inspectFiles, useServerFiles } from "./runtime.js";
4
2
  //#region src/nitro.d.ts
5
3
  /**
6
4
  * A structurally compatible Nitro v2/v3 module. Nitro loads this export
@@ -8,8 +6,8 @@ import { NuxtFilesSingleStorage, NuxtFilesStorageRegistry, configureFiles, inspe
8
6
  */
9
7
  declare const _default: {
10
8
  name: string;
11
- setup: (nitro: NitroIntegration) => Promise<void>;
9
+ setup: (nitro: NitroIntegration) => Promise<boolean>;
12
10
  };
13
11
  //#endregion
14
- export { type FilesForStorage, type FilesProviderFactories, type FilesProviderFactory, FilesRegistry, type FilesRuntimeHooks, NuxtFilesSingleStorage, NuxtFilesStorageRegistry, type SingleStorage, type StorageRegistry, configureFiles, _default as default, inspectFiles, useServerFiles };
12
+ export { _default as default };
15
13
  //# sourceMappingURL=nitro.d.ts.map
package/dist/nitro.js CHANGED
@@ -1,6 +1,4 @@
1
1
  import { setupNitroFilesIntegration } from "./integration/nitro.js";
2
- import { FilesRegistry } from "./runtime/registry.js";
3
- import { configureFiles, inspectFiles, useServerFiles } from "./runtime.js";
4
2
  import { resolve } from "node:path";
5
3
  //#region src/nitro.ts
6
4
  /**
@@ -11,10 +9,10 @@ var nitro_default = {
11
9
  name: "nuxt-files-sdk",
12
10
  setup: (nitro) => setupNitroFilesIntegration(nitro, {
13
11
  configPath: resolve(nitro.options.rootDir, "files.config.ts"),
14
- development: Boolean(nitro.options.dev)
12
+ environments: nitro.options.static ? ["production", "prerender"] : [nitro.options.dev ? "development" : "production"]
15
13
  })
16
14
  };
17
15
  //#endregion
18
- export { FilesRegistry, configureFiles, nitro_default as default, inspectFiles, useServerFiles };
16
+ export { nitro_default as default };
19
17
 
20
18
  //# sourceMappingURL=nitro.js.map
package/dist/nitro.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"nitro.js","names":[],"sources":["../src/nitro.ts"],"sourcesContent":["import { resolve } from 'node:path'\n\nimport { setupNitroFilesIntegration, type NitroIntegration } from './integration/nitro'\n\n/**\n * A structurally compatible Nitro v2/v3 module. Nitro loads this export\n * directly from `modules: ['nuxt-files-sdk/nitro']`.\n */\nexport default {\n name: 'nuxt-files-sdk',\n setup: (nitro: NitroIntegration) =>\n setupNitroFilesIntegration(nitro, {\n configPath: resolve(nitro.options.rootDir, 'files.config.ts'),\n development: Boolean(nitro.options.dev),\n }),\n}\n\nexport * from './runtime'\n"],"mappings":";;;;;;;;;AAQA,IAAA,gBAAe;CACX,MAAM;CACN,QAAQ,UACJ,2BAA2B,OAAO;EAC9B,YAAY,QAAQ,MAAM,QAAQ,SAAS,iBAAiB;EAC5D,aAAa,QAAQ,MAAM,QAAQ,GAAG;CAC1C,CAAC;AACT"}
1
+ {"version":3,"file":"nitro.js","names":[],"sources":["../src/nitro.ts"],"sourcesContent":["import { resolve } from 'node:path'\n\nimport { setupNitroFilesIntegration, type NitroIntegration } from './integration/nitro'\n\n/**\n * A structurally compatible Nitro v2/v3 module. Nitro loads this export\n * directly from `modules: ['nuxt-files-sdk/nitro']`.\n */\nexport default {\n name: 'nuxt-files-sdk',\n setup: (nitro: NitroIntegration) =>\n setupNitroFilesIntegration(nitro, {\n configPath: resolve(nitro.options.rootDir, 'files.config.ts'),\n environments: nitro.options.static\n ? ['production', 'prerender']\n : [nitro.options.dev ? 'development' : 'production'],\n }),\n}\n"],"mappings":";;;;;;;AAQA,IAAA,gBAAe;CACX,MAAM;CACN,QAAQ,UACJ,2BAA2B,OAAO;EAC9B,YAAY,QAAQ,MAAM,QAAQ,SAAS,iBAAiB;EAC5D,cAAc,MAAM,QAAQ,SACtB,CAAC,cAAc,WAAW,IAC1B,CAAC,MAAM,QAAQ,MAAM,gBAAgB,YAAY;CAC3D,CAAC;AACT"}
package/dist/package.js CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var version = "0.0.5";
2
+ var version = "0.1.1";
3
3
  //#endregion
4
4
  export { version };
5
5
 
@@ -0,0 +1,11 @@
1
+ import { FilesConfig } from "../config.js";
2
+ import { FilesRegistry } from "./registry.js";
3
+ import { Files } from "files-sdk";
4
+ //#region src/runtime/internal.d.ts
5
+ /** Configure the process-local Files registry used by {@link useServerFiles}. */
6
+ export declare const configureFiles: <const C extends FilesConfig>(config: C, options: ConstructorParameters<typeof FilesRegistry<C>>[1]) => FilesRegistry<C>;
7
+ /** Return secret-free diagnostics for the configured process-local Files registry. */
8
+ export declare const inspectFiles: () => ReturnType<FilesRegistry['inspect']>;
9
+ export declare const getFiles: (name?: string) => Files;
10
+ //#endregion
11
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1,30 @@
1
+ import { FilesRegistry } from "./registry.js";
2
+ //#region src/runtime/internal.ts
3
+ let registry;
4
+ let registryDiagnostic;
5
+ /** Configure the process-local Files registry used by {@link useServerFiles}. */
6
+ const configureFiles = (config, options) => {
7
+ try {
8
+ const value = new FilesRegistry(config, options);
9
+ registry = value;
10
+ registryDiagnostic = void 0;
11
+ return value;
12
+ } catch (error) {
13
+ registry = void 0;
14
+ registryDiagnostic = { code: "NUXT_FILES_INVALID_CONFIG" };
15
+ throw error;
16
+ }
17
+ };
18
+ /** Return secret-free diagnostics for the configured process-local Files registry. */
19
+ const inspectFiles = () => registry?.inspect() ?? {
20
+ storages: [],
21
+ diagnostics: [registryDiagnostic ?? { code: "NUXT_FILES_NOT_CONFIGURED" }]
22
+ };
23
+ const getFiles = (name) => {
24
+ if (!registry) throw new Error("[nuxt-files-sdk:not-configured] The Files registry has not been configured.");
25
+ return name === void 0 ? registry.get() : registry.get(name);
26
+ };
27
+ //#endregion
28
+ export { configureFiles, getFiles, inspectFiles };
29
+
30
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.js","names":[],"sources":["../../src/runtime/internal.ts"],"sourcesContent":["import type { Files } from 'files-sdk'\n\nimport type { FilesConfig } from '../config'\nimport { FilesRegistry, type RegistryDiagnostic } from './registry'\n\nlet registry: FilesRegistry | undefined\nlet registryDiagnostic: RegistryDiagnostic | undefined\n\n/** Configure the process-local Files registry used by {@link useServerFiles}. */\nexport const configureFiles = <const C extends FilesConfig>(\n config: C,\n options: ConstructorParameters<typeof FilesRegistry<C>>[1],\n): FilesRegistry<C> => {\n try {\n const value = new FilesRegistry(config, options)\n registry = value\n registryDiagnostic = undefined\n return value\n } catch (error) {\n registry = undefined\n registryDiagnostic = { code: 'NUXT_FILES_INVALID_CONFIG' }\n throw error\n }\n}\n\n/** Return secret-free diagnostics for the configured process-local Files registry. */\nexport const inspectFiles = (): ReturnType<FilesRegistry['inspect']> =>\n registry?.inspect() ?? {\n storages: [],\n diagnostics: [registryDiagnostic ?? { code: 'NUXT_FILES_NOT_CONFIGURED' }],\n }\n\nexport const getFiles = (name?: string): Files => {\n if (!registry) throw new Error('[nuxt-files-sdk:not-configured] The Files registry has not been configured.')\n return name === undefined ? registry.get() : (registry.get as (storage: string) => Files)(name)\n}\n"],"mappings":";;AAKA,IAAI;AACJ,IAAI;;AAGJ,MAAa,kBACT,QACA,YACmB;CACnB,IAAI;EACA,MAAM,QAAQ,IAAI,cAAc,QAAQ,OAAO;EAC/C,WAAW;EACX,qBAAqB,KAAA;EACrB,OAAO;CACX,SAAS,OAAO;EACZ,WAAW,KAAA;EACX,qBAAqB,EAAE,MAAM,4BAA4B;EACzD,MAAM;CACV;AACJ;;AAGA,MAAa,qBACT,UAAU,QAAQ,KAAK;CACnB,UAAU,CAAC;CACX,aAAa,CAAC,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAC7E;AAEJ,MAAa,YAAY,SAAyB;CAC9C,IAAI,CAAC,UAAU,MAAM,IAAI,MAAM,6EAA6E;CAC5G,OAAO,SAAS,KAAA,IAAY,SAAS,IAAI,IAAK,SAAS,IAAmC,IAAI;AAClG"}
@@ -0,0 +1,29 @@
1
+ //#region src/runtime/normalize.ts
2
+ const isObject = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
3
+ const isStorage = (value) => isObject(value) && (typeof value.adapter === "string" || typeof value.adapter === "function");
4
+ /** Validate one resolved config without selecting an environment or evaluating provider options. */
5
+ const normalizeFilesConfig = (config) => {
6
+ if (!isObject(config)) throw new Error("[nuxt-files-sdk:invalid-config] Files configuration must be an object.");
7
+ const { storage } = config;
8
+ if (!isObject(storage)) throw new Error("[nuxt-files-sdk:invalid-config] At least one storage is required.");
9
+ const entries = /* @__PURE__ */ new Map();
10
+ if (isStorage(storage)) entries.set(void 0, {
11
+ name: void 0,
12
+ storage
13
+ });
14
+ else {
15
+ if (!Object.keys(storage).length) throw new Error("[nuxt-files-sdk:invalid-config] At least one storage is required.");
16
+ for (const [name, value] of Object.entries(storage)) {
17
+ if (!isStorage(value)) throw new Error(`[nuxt-files-sdk:invalid-config] Invalid storage "${name}".`);
18
+ entries.set(name, {
19
+ name,
20
+ storage: value
21
+ });
22
+ }
23
+ }
24
+ return entries;
25
+ };
26
+ //#endregion
27
+ export { normalizeFilesConfig };
28
+
29
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","names":[],"sources":["../../src/runtime/normalize.ts"],"sourcesContent":["import type { StorageConfig } from '../config'\n\nexport interface StorageEntry {\n name: string | undefined\n storage: StorageConfig\n}\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === 'object' && !Array.isArray(value)\nconst isStorage = (value: unknown): value is StorageConfig =>\n isObject(value) && (typeof value.adapter === 'string' || typeof value.adapter === 'function')\n\n/** Validate one resolved config without selecting an environment or evaluating provider options. */\nexport const normalizeFilesConfig = (config: unknown): Map<string | undefined, StorageEntry> => {\n if (!isObject(config)) throw new Error('[nuxt-files-sdk:invalid-config] Files configuration must be an object.')\n const { storage } = config\n if (!isObject(storage)) throw new Error('[nuxt-files-sdk:invalid-config] At least one storage is required.')\n const entries = new Map<string | undefined, StorageEntry>()\n if (isStorage(storage)) {\n entries.set(undefined, { name: undefined, storage })\n } else {\n if (!Object.keys(storage).length)\n throw new Error('[nuxt-files-sdk:invalid-config] At least one storage is required.')\n for (const [name, value] of Object.entries(storage)) {\n if (!isStorage(value)) throw new Error(`[nuxt-files-sdk:invalid-config] Invalid storage \"${name}\".`)\n entries.set(name, { name, storage: value })\n }\n }\n return entries\n}\n"],"mappings":";AAOA,MAAM,YAAY,UACd,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACvE,MAAM,aAAa,UACf,SAAS,KAAK,MAAM,OAAO,MAAM,YAAY,YAAY,OAAO,MAAM,YAAY;;AAGtF,MAAa,wBAAwB,WAA2D;CAC5F,IAAI,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,MAAM,wEAAwE;CAC/G,MAAM,EAAE,YAAY;CACpB,IAAI,CAAC,SAAS,OAAO,GAAG,MAAM,IAAI,MAAM,mEAAmE;CAC3G,MAAM,0BAAU,IAAI,IAAsC;CAC1D,IAAI,UAAU,OAAO,GACjB,QAAQ,IAAI,KAAA,GAAW;EAAE,MAAM,KAAA;EAAW;CAAQ,CAAC;MAChD;EACH,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,QACtB,MAAM,IAAI,MAAM,mEAAmE;EACvF,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,OAAO,GAAG;GACjD,IAAI,CAAC,UAAU,KAAK,GAAG,MAAM,IAAI,MAAM,oDAAoD,KAAK,GAAG;GACnG,QAAQ,IAAI,MAAM;IAAE;IAAM,SAAS;GAAM,CAAC;EAC9C;CACJ;CACA,OAAO;AACX"}
@@ -0,0 +1,53 @@
1
+ //#region src/runtime/provider-types.d.ts
2
+ export interface ProviderFactories {
3
+ akamai: typeof import('files-sdk/akamai').akamai;
4
+ alibaba: typeof import('files-sdk/alibaba').alibaba;
5
+ appwrite: typeof import('files-sdk/appwrite').appwrite;
6
+ archil: typeof import('files-sdk/archil').archil;
7
+ azure: typeof import('files-sdk/azure').azure;
8
+ 'backblaze-b2': typeof import('files-sdk/backblaze-b2').backblazeB2;
9
+ box: typeof import('files-sdk/box').box;
10
+ 'bun-s3': typeof import('files-sdk/bun-s3').bunS3;
11
+ 'bunny-storage': typeof import('files-sdk/bunny-storage').bunnyStorage;
12
+ cloudinary: typeof import('files-sdk/cloudinary').cloudinaryAdapter;
13
+ convex: typeof import('files-sdk/convex').convex;
14
+ 'digitalocean-spaces': typeof import('files-sdk/digitalocean-spaces').digitaloceanSpaces;
15
+ dropbox: typeof import('files-sdk/dropbox').dropbox;
16
+ exoscale: typeof import('files-sdk/exoscale').exoscale;
17
+ filebase: typeof import('files-sdk/filebase').filebase;
18
+ 'firebase-storage': typeof import('files-sdk/firebase-storage').firebaseStorage;
19
+ fs: typeof import('files-sdk/fs').fs;
20
+ ftp: typeof import('files-sdk/ftp').ftp;
21
+ gcs: typeof import('files-sdk/gcs').gcs;
22
+ 'google-drive': typeof import('files-sdk/google-drive').googleDrive;
23
+ hetzner: typeof import('files-sdk/hetzner').hetzner;
24
+ 'ibm-cos': typeof import('files-sdk/ibm-cos').ibmCos;
25
+ 'idrive-e2': typeof import('files-sdk/idrive-e2').idriveE2;
26
+ memory: typeof import('files-sdk/memory').memory;
27
+ minio: typeof import('files-sdk/minio').minio;
28
+ neon: typeof import('files-sdk/neon').neon;
29
+ 'netlify-blobs': typeof import('files-sdk/netlify-blobs').netlifyBlobs;
30
+ onedrive: typeof import('files-sdk/onedrive').onedrive;
31
+ 'oracle-cloud': typeof import('files-sdk/oracle-cloud').oracleCloud;
32
+ ovhcloud: typeof import('files-sdk/ovhcloud').ovhcloud;
33
+ pocketbase: typeof import('files-sdk/pocketbase').pocketbase;
34
+ r2: typeof import('files-sdk/r2').r2;
35
+ rustfs: typeof import('files-sdk/rustfs').rustfs;
36
+ s3: typeof import('files-sdk/s3').s3;
37
+ 's3-fetch': typeof import('files-sdk/s3-fetch').s3Fetch;
38
+ scaleway: typeof import('files-sdk/scaleway').scaleway;
39
+ sftp: typeof import('files-sdk/sftp').sftp;
40
+ sharepoint: typeof import('files-sdk/sharepoint').sharepoint;
41
+ storj: typeof import('files-sdk/storj').storj;
42
+ supabase: typeof import('files-sdk/supabase').supabase;
43
+ tencent: typeof import('files-sdk/tencent').tencent;
44
+ tigris: typeof import('files-sdk/tigris').tigris;
45
+ uploadthing: typeof import('files-sdk/uploadthing').uploadthing;
46
+ 'vercel-blob': typeof import('files-sdk/vercel-blob').vercelBlob;
47
+ vultr: typeof import('files-sdk/vultr').vultr;
48
+ wasabi: typeof import('files-sdk/wasabi').wasabi;
49
+ webdav: typeof import('files-sdk/webdav').webdav;
50
+ yandex: typeof import('files-sdk/yandex').yandex;
51
+ }
52
+ //#endregion
53
+ //# sourceMappingURL=provider-types.d.ts.map
@@ -1,13 +1,44 @@
1
- import { DevelopmentOnlyNamedFilesConfig, DevelopmentOnlySingleFilesConfig, FilesConfig, NamedFilesConfig, SingleFilesConfig, StorageConfig } from "../config.js";
2
- import { FilesDevtoolsSnapshot } from "../devtools/snapshot.js";
1
+ import { ProviderFactories } from "./provider-types.js";
2
+ import { FilesConfig, FilesConfigInput } from "../config.js";
3
+ import { FilesDevtoolsDiagnosticCode } from "../devtools/diagnostics.js";
3
4
  import { Adapter, ExtensionsOf, Files, FilesActionEvent, FilesErrorEvent, FilesRetryEvent, ProviderSlug } from "files-sdk";
4
5
  //#region src/runtime/registry.d.ts
5
6
  /** Native Files client plus the methods contributed by a storage's plugins. */
6
- export type FilesForStorage<T extends StorageConfig> = Files & ExtensionsOf<NonNullable<T['plugins']>>;
7
+ type AdapterFor<A> = A extends ProviderSlug ? ReturnType<ProviderFactories[A]> : A extends ((...args: never[]) => Adapter) ? ReturnType<A> : never;
8
+ type PluginsFor<T> = T extends {
9
+ plugins: infer V;
10
+ } ? V extends ((...args: never[]) => infer P) ? P extends readonly import('files-sdk').FilesPlugin[] ? P : never : V extends readonly import('files-sdk').FilesPlugin[] ? V : never : never;
11
+ export type FilesForStorage<T extends {
12
+ adapter: ProviderSlug | ((...args: never[]) => Adapter);
13
+ }> = Files<AdapterFor<T['adapter']>> & ExtensionsOf<PluginsFor<T>>;
14
+ type StorageOf<C> = C extends {
15
+ storage: infer S;
16
+ } ? S : never;
17
+ type StorageBranch<C> = StorageOf<C> | StorageOf<C extends {
18
+ $development: infer E;
19
+ } ? E : never> | StorageOf<C extends {
20
+ $production: infer E;
21
+ } ? E : never> | StorageOf<C extends {
22
+ $test: infer E;
23
+ } ? E : never> | StorageOf<C extends {
24
+ $prerender: infer E;
25
+ } ? E : never> | StorageOf<C extends {
26
+ $env: infer E;
27
+ } ? E[keyof E] : never>;
28
+ type SingleEntry<C> = Extract<StorageBranch<C>, {
29
+ adapter: ProviderSlug | ((...args: never[]) => Adapter);
30
+ }>;
31
+ type NamedSet<C> = Exclude<StorageBranch<C>, {
32
+ adapter: unknown;
33
+ }>;
34
+ type StorageNames<C> = NamedSet<C> extends (infer S) ? (S extends object ? keyof S : never) : never;
35
+ type NamedEntry<C, Name extends PropertyKey> = NamedSet<C> extends (infer S) ? (S extends object ? (Name extends keyof S ? S[Name] : never) : never) : never;
7
36
  /** Map each configured storage name to its native Files client and plugin extensions. */
8
- export type StorageRegistry<C extends FilesConfig> = C extends NamedFilesConfig<infer Storages> ? { [Name in keyof Storages]: FilesForStorage<Storages[Name]>; } : C extends DevelopmentOnlyNamedFilesConfig<infer Storages> ? { [Name in keyof Storages]: FilesForStorage<Storages[Name]>; } : Record<never, never>;
37
+ export type StorageRegistry<C extends FilesConfigInput> = { [Name in StorageNames<C>]: FilesForStorage<Extract<NamedEntry<C, Name>, {
38
+ adapter: ProviderSlug | ((...args: never[]) => Adapter);
39
+ }>>; };
9
40
  /** Files client returned by an unnamed single-storage configuration. */
10
- export type SingleStorage<C extends FilesConfig> = C extends SingleFilesConfig<infer Storage> ? FilesForStorage<Storage> : C extends DevelopmentOnlySingleFilesConfig<infer Storage> ? FilesForStorage<Storage> : never;
41
+ export type SingleStorage<C extends FilesConfigInput> = FilesForStorage<SingleEntry<C>>;
11
42
  /** Hooks emitted by the Nuxt/Nitro bridge after the storage's native hooks. */
12
43
  export interface FilesRuntimeHooks {
13
44
  /** Observe a failed native Files operation. */
@@ -21,21 +52,37 @@ export interface FilesRuntimeHooks {
21
52
  export type FilesProviderFactory = (config: never) => Adapter;
22
53
  /** Provider factories available in the current build. */
23
54
  export type FilesProviderFactories = Partial<Record<ProviderSlug, FilesProviderFactory>>;
55
+ export type ProviderEnvironment = Partial<Record<ProviderSlug, readonly (readonly string[])[]>>;
56
+ export interface RegistryDiagnostic {
57
+ code: FilesDevtoolsDiagnosticCode;
58
+ name?: string;
59
+ adapter?: string;
60
+ }
24
61
  /** Lazily construct and memoize native Files clients for a validated project configuration. */
25
62
  export declare class FilesRegistry<const C extends FilesConfig = FilesConfig> {
26
63
  #private;
27
64
  /** Create a registry without constructing a provider. */
28
65
  constructor(config: C, options: {
29
- development?: boolean;
66
+ environment?: ProviderEnvironment;
30
67
  factories: FilesProviderFactories;
31
68
  hooks?: FilesRuntimeHooks;
32
69
  });
33
70
  /** Return the client from an unnamed single-storage configuration. */
34
- get(...args: C extends SingleFilesConfig | DevelopmentOnlySingleFilesConfig ? [] : [name: never]): SingleStorage<C>;
71
+ get(...args: SingleEntry<C> extends never ? [name: never] : []): SingleStorage<C>;
35
72
  /** Return one named storage client. */
36
73
  get<Name extends Extract<keyof StorageRegistry<C>, string>>(name: Name): StorageRegistry<C>[Name];
37
74
  /** Return secret-free storage metadata and initialization state for development diagnostics. */
38
- inspect(): FilesDevtoolsSnapshot;
75
+ inspect(): {
76
+ storages: {
77
+ name?: string;
78
+ adapter: string;
79
+ plugins: any[];
80
+ initialized: boolean;
81
+ }[];
82
+ diagnostics: RegistryDiagnostic[];
83
+ };
84
+ /** Resolve one selected adapter without constructing its Files client. */
85
+ resolveAdapter(name?: string): Adapter;
39
86
  }
40
87
  //#endregion
41
88
  //# sourceMappingURL=registry.d.ts.map