vitend 0.4.0 → 0.4.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.
package/dist/vite.js CHANGED
@@ -96,6 +96,10 @@ const getPackageJson = (cwd) => {
96
96
  return JSON.parse(rawPackageJson);
97
97
  };
98
98
 
99
+ const toPosix = (path) => {
100
+ return path.split(node_path.sep).join(node_path.posix.sep);
101
+ };
102
+
99
103
  const getSsrTarget = (runtime) => {
100
104
  switch (runtime) {
101
105
  case "workerd": return "webworker";
@@ -150,7 +154,7 @@ const buildPlugin = (opts) => {
150
154
  load: async (id) => {
151
155
  if (id !== VIRTUAL_ENTRY_RESOLVED) return void 0;
152
156
  let code = "";
153
- code += `import options from "${opts.entry}";`;
157
+ code += `import options from "${toPosix(opts.entry)}";`;
154
158
  code += `import { serve } from "vitend/runtime";`;
155
159
  if (build.target === "vercel") {
156
160
  code += `const server = serve({ ...options, manual: true });`;
@@ -163,9 +167,9 @@ const buildPlugin = (opts) => {
163
167
  if (build.port !== 3e3) code += `port: ${build.port},`;
164
168
  if (build.https) {
165
169
  code += `tls: {`;
166
- if (build.https.cert) code += `cert: "${build.https.cert}",`;
167
- if (build.https.key) code += `key: "${build.https.key}",`;
168
- if (build.https.passphrase) code += `passphrase: "${build.https.passphrase}",`;
170
+ if (build.https.cert) code += `cert: "${toPosix(build.https.cert)}",`;
171
+ if (build.https.key) code += `key: "${toPosix(build.https.key)}",`;
172
+ if (build.https.passphrase) code += `passphrase: "${toPosix(build.https.passphrase)}",`;
169
173
  code += `},`;
170
174
  }
171
175
  code += `});`;
@@ -305,8 +309,8 @@ const vitend = (options) => {
305
309
  const plugins = [devPlugin({ ...opts }), buildPlugin({ ...opts })];
306
310
  if (build.target === "default" && build.copyPublicDir) {
307
311
  const copyOptions = { targets: [{
308
- src: node_path.resolve(build.publicDir, "**", "*"),
309
- dest: node_path.resolve(build.outputDir, build.publicDir)
312
+ src: node_path.posix.join(build.publicDir, "**", "*"),
313
+ dest: node_path.posix.join(build.outputDir, build.publicDir)
310
314
  }] };
311
315
  if (opts.verbose) {
312
316
  copyOptions.onStart = () => {
package/dist/vite.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"vite.js","names":["Fs","Path","Path","Fs","builtinModules","Path"],"sources":["../src/configs/log.ts","../src/functions/entry.ts","../src/functions/options.ts","../src/functions/package-json.ts","../src/functions/ssr.ts","../src/vite/build.ts","../src/vite/dev.ts","../src/vite/vitend.ts"],"sourcesContent":["import type { ConsolaInstance } from \"consola\";\n\nimport { createConsola } from \"consola\";\n\nconst log: ConsolaInstance = createConsola({\n formatOptions: {\n date: false,\n },\n});\n\nexport { log };\n","import * as Fs from \"node:fs\";\nimport * as Path from \"node:path\";\n\nconst ENTRY_DEFAULT: string[] = [\n \"./src/index.ts\",\n \"./src/index.js\",\n];\n\nconst getEntry = (cwd: string, entry?: string): string => {\n if (!entry) {\n for (const ent of ENTRY_DEFAULT) {\n if (Fs.existsSync(Path.resolve(cwd, ent))) {\n entry = ent;\n break;\n }\n }\n\n if (!entry) {\n throw new Error(\"No entry file found\");\n }\n }\n\n return Path.resolve(cwd, entry);\n};\n\nexport { getEntry };\n","import type { Omit } from \"ts-vista\";\n\nimport type { VitendOptions } from \"#/@types/options/default\";\nimport type {\n ResolvedDefaultBuildOptions,\n ResolvedVercelBuildOptions,\n ResolvedVitendOptions,\n} from \"#/@types/options/resolved\";\n\nimport { toMerged } from \"es-toolkit\";\n\nimport { getEntry } from \"#/functions/entry\";\n\nconst OPTIONS_BUILD_DEFAULT: ResolvedDefaultBuildOptions = {\n target: \"default\",\n host: \"localhost\",\n port: 3000,\n bundle: \"external\",\n outputDir: \"./dist\",\n outputFile: \"index.js\",\n minify: false,\n publicDir: \"./public\",\n copyPublicDir: false,\n};\n\nconst OPTIONS_BUILD_VERCEL: ResolvedVercelBuildOptions = {\n target: \"vercel\",\n bundle: \"external\",\n outputDir: \"./dist\",\n outputFile: \"index.js\",\n minify: false,\n};\n\nconst OPTIONS_DEFAULT: Omit<ResolvedVitendOptions, \"entry\" | \"build\"> = {\n cwd: process.cwd(),\n runtime: \"node\",\n dev: {\n host: \"localhost\",\n port: 3001,\n },\n verbose: false,\n};\n\nconst getDefaultOptions = (\n isVercel: boolean,\n): Omit<ResolvedVitendOptions, \"entry\"> => {\n return {\n ...OPTIONS_DEFAULT,\n build: isVercel ? OPTIONS_BUILD_VERCEL : OPTIONS_BUILD_DEFAULT,\n };\n};\n\nconst createOptions = (options?: VitendOptions): ResolvedVitendOptions => {\n const isVercel: boolean = options?.build?.target === \"vercel\";\n\n const merged = toMerged(getDefaultOptions(isVercel), options ?? {});\n\n return {\n ...merged,\n entry: getEntry(merged.cwd, options?.entry),\n };\n};\n\nexport { createOptions };\n","import type { Format, Partial } from \"ts-vista\";\n\nimport * as Fs from \"node:fs\";\nimport * as Path from \"node:path\";\n\ntype CompletePackageJson = {\n type: \"module\" | \"commonjs\";\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n peerDependencies: Record<string, string>;\n};\n\ntype PackageJson = Format<Partial<CompletePackageJson>>;\n\nconst getPackageJson = (cwd: string): PackageJson => {\n const path: string = Path.resolve(cwd, \"package.json\");\n\n if (!Fs.existsSync(path)) {\n throw new Error(\"Failed to find package.json\");\n }\n\n const rawPackageJson: string = Fs.readFileSync(path, \"utf-8\");\n\n return JSON.parse(rawPackageJson);\n};\n\nexport type { CompletePackageJson, PackageJson };\nexport { getPackageJson };\n","import type { SSRTarget } from \"vite\";\n\nimport type { Runtime } from \"#/@types/options/complete\";\n\nconst getSsrTarget = (runtime: Runtime): SSRTarget => {\n switch (runtime) {\n case \"workerd\":\n return \"webworker\";\n default:\n return \"node\";\n }\n};\n\nexport { getSsrTarget };\n","import type { LoadResult, ResolveIdResult } from \"rollup\";\nimport type { Plugin, UserConfig } from \"vite\";\n\nimport type {\n ResolvedBuildOptions,\n ResolvedVitendOptions,\n} from \"#/@types/options/resolved\";\nimport type { PackageJson } from \"#/functions/package-json\";\n\nimport { builtinModules } from \"node:module\";\n\nimport { toMerged } from \"es-toolkit\";\n\nimport { getPackageJson } from \"#/functions/package-json\";\nimport { getSsrTarget } from \"#/functions/ssr\";\n\nconst VIRTUAL_ENTRY = \"virtual:vitend-entry\" as const;\n\nconst VIRTUAL_ENTRY_RESOLVED = `\\0${VIRTUAL_ENTRY}` as const;\n\nconst buildPlugin = (opts: ResolvedVitendOptions): Plugin => {\n const build: ResolvedBuildOptions = opts.build;\n\n const packageJson: PackageJson = getPackageJson(opts.cwd);\n\n return {\n name: \"vitend/build\",\n apply: \"build\",\n config: (config: UserConfig): UserConfig => {\n let result: UserConfig = {};\n\n let baseConfig: UserConfig = {\n resolve: {\n conditions: [\n opts.runtime,\n ],\n },\n ssr: {\n target: getSsrTarget(opts.runtime),\n resolve: {\n conditions: [\n opts.runtime,\n ],\n },\n },\n build: {\n copyPublicDir: false,\n },\n };\n\n if (build.bundle === \"external\") {\n baseConfig = toMerged(baseConfig, {\n ssr: {\n external: true,\n noExternal: void 0,\n },\n });\n }\n\n if (build.bundle === \"standalone\") {\n baseConfig = toMerged(baseConfig, {\n ssr: {\n noExternal: true,\n },\n });\n }\n\n result = toMerged(baseConfig, config);\n\n const overrideConfig: UserConfig = {\n build: {\n ssr: true,\n outDir: build.outputDir,\n rollupOptions: {\n input: VIRTUAL_ENTRY,\n output: {\n entryFileNames: build.outputFile,\n format:\n packageJson.type === \"module\" ? \"esm\" : \"cjs\",\n },\n external: [\n ...builtinModules,\n /^node:/,\n ],\n },\n minify: build.minify,\n },\n };\n\n result = toMerged(result, overrideConfig);\n\n return result;\n },\n resolveId: (id: string): ResolveIdResult => {\n if (id !== VIRTUAL_ENTRY) return void 0;\n return VIRTUAL_ENTRY_RESOLVED;\n },\n load: async (id: string): Promise<LoadResult> => {\n if (id !== VIRTUAL_ENTRY_RESOLVED) return void 0;\n\n let code: string = \"\";\n\n code += `import options from \"${opts.entry}\";`;\n code += `import { serve } from \"vitend/runtime\";`;\n\n // vercel export\n\n if (build.target === \"vercel\") {\n code += `const server = serve({ ...options, manual: true });`;\n code += `export default server;`;\n\n return code;\n }\n\n // default export\n\n code += `serve({`;\n code += `...options,`;\n\n if (build.host !== \"localhost\")\n code += `hostname: \"${build.host}\",`;\n if (build.port !== 3000) code += `port: ${build.port},`;\n\n if (build.https) {\n code += `tls: {`;\n if (build.https.cert) code += `cert: \"${build.https.cert}\",`;\n if (build.https.key) code += `key: \"${build.https.key}\",`;\n if (build.https.passphrase)\n code += `passphrase: \"${build.https.passphrase}\",`;\n code += `},`;\n }\n\n code += `});`;\n\n return code;\n },\n };\n};\n\nexport { buildPlugin };\n","import type HTTP from \"node:http\";\n\nimport type { Server, ServerHandler, ServerOptions } from \"srvx\";\nimport type { Connect, Plugin, UserConfig, ViteDevServer } from \"vite\";\n\nimport type {\n ResolvedDevOptions,\n ResolvedHttpsOptions,\n ResolvedVitendOptions,\n} from \"#/@types/options/resolved\";\n\nimport { toMerged } from \"es-toolkit\";\nimport { serve } from \"srvx\";\n\nimport { getSsrTarget } from \"#/functions/ssr\";\n\ntype CreateMiddlewareOptions = {\n vite: ViteDevServer;\n server: Server;\n};\n\nconst createRequestHeaders = (headers: HTTP.IncomingHttpHeaders): Headers => {\n const result: Headers = new Headers();\n\n const entries: [\n string,\n string | string[] | undefined,\n ][] = Object.entries(headers);\n\n for (let i: number = 0; i < entries.length; i++) {\n const entry:\n | [\n string,\n string | string[] | undefined,\n ]\n | undefined = entries[i];\n\n if (entry === void 0) continue;\n\n const [key, value] = entry;\n\n // ignore HTTP/2 pseudo-headers\n if (key.startsWith(\":\")) continue;\n\n if (value === void 0) continue;\n\n if (Array.isArray(value)) {\n for (let j: number = 0; j < value.length; j++) {\n const vl: string | undefined = value[j];\n\n if (vl === void 0) continue;\n\n result.append(key, vl);\n }\n } else {\n result.set(key, value);\n }\n }\n\n return result;\n};\n\nconst createMiddleware = ({ vite, server }: CreateMiddlewareOptions) => {\n return async (\n req: Connect.IncomingMessage,\n res: HTTP.ServerResponse,\n _next: Connect.NextFunction,\n ): Promise<void> => {\n const isHttps: boolean =\n vite.config.server.https?.cert !== void 0 &&\n vite.config.server.https?.key !== void 0;\n\n const protocol: string = `http${isHttps ? \"s\" : \"\"}`;\n\n const host: string = process.env.HOST ?? \"localhost\";\n\n const port: number = vite.config.server.port;\n\n const path: string = req.url ?? \"\";\n\n const url: URL = new URL(`${protocol}://${host}:${port}${path}`);\n\n const body: Connect.IncomingMessage | undefined =\n req.method !== \"GET\" && req.method !== \"HEAD\" ? req : void 0;\n\n const request: Request = new Request(url, {\n method: req.method,\n headers: createRequestHeaders(req.headers),\n body,\n duplex: \"half\",\n } as RequestInit);\n\n const response: Response = await server.fetch(request);\n\n res.statusCode = response.status;\n\n response.headers.forEach((value: string, key: string): void => {\n res.setHeader(key, value);\n });\n\n if (!response.body) {\n res.end();\n return void 0;\n }\n\n const reader: ReadableStreamDefaultReader<Uint8Array<ArrayBuffer>> =\n response.body.getReader();\n\n const stream = async (): Promise<void> => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n res.write(value);\n }\n\n res.end();\n } catch {\n res.end();\n }\n };\n\n await stream();\n };\n};\n\ntype Middleware = ReturnType<typeof createMiddleware>;\n\nconst devPlugin = (opts: ResolvedVitendOptions): Plugin => {\n const dev: ResolvedDevOptions = opts.dev;\n const https: ResolvedHttpsOptions = opts.dev.https ?? {};\n\n return {\n name: \"vitend/dev\",\n apply: \"serve\",\n config(config: UserConfig): UserConfig {\n const devConfig: UserConfig = {\n resolve: {\n conditions: [\n opts.runtime,\n ],\n },\n ssr: {\n target: getSsrTarget(opts.runtime),\n resolve: {\n conditions: [\n opts.runtime,\n ],\n },\n },\n build: {\n ssr: true,\n rollupOptions: {\n input: opts.entry,\n },\n },\n server: {\n host: dev.host,\n port: dev.port,\n ...(https.cert !== void 0 && https.key !== void 0\n ? {\n https: {\n cert: https.cert,\n key: https.key,\n passphrase: https.passphrase,\n },\n }\n : {}),\n },\n };\n\n return toMerged(config, devConfig);\n },\n configureServer: async (vite: ViteDevServer): Promise<void> => {\n const serverOptions: ServerOptions = (\n await vite.ssrLoadModule(opts.entry)\n ).default;\n\n const server: Server<ServerHandler> = serve({\n // base\n gracefulShutdown: false,\n // user\n ...serverOptions,\n // override\n manual: true,\n hostname: dev.host,\n port: dev.port,\n tls: {\n cert: https.cert,\n key: https.key,\n passphrase: https.passphrase,\n },\n });\n\n const middleware: Middleware = createMiddleware({\n vite,\n server,\n });\n\n vite.middlewares.use(middleware);\n },\n };\n};\n\nexport { devPlugin };\n","import type { CopyEvent, Options as CopyOptions } from \"rolldown-plugin-copy\";\nimport type { Plugin } from \"vite\";\n\nimport type { VitendOptions } from \"#/@types/options/default\";\nimport type {\n ResolvedBuildOptions,\n ResolvedVitendOptions,\n} from \"#/@types/options/resolved\";\n\nimport * as Path from \"node:path\";\n\nimport { copy } from \"rolldown-plugin-copy\";\n\nimport { log } from \"#/configs/log\";\nimport { createOptions } from \"#/functions/options\";\nimport { buildPlugin } from \"#/vite/build\";\nimport { devPlugin } from \"#/vite/dev\";\n\n/**\n * The `vitend` plugin.\n *\n * ### Example\n *\n * ```ts\n * // ./vite.config.ts\n *\n * import { defineConfig } from \"vite\";\n * import { vitend } from \"vitend/vite\";\n *\n * export default defineConfig({\n * plugins: [\n * vitend(),\n * ],\n * });\n * ```\n */\nconst vitend = (options?: VitendOptions): Plugin[] => {\n const opts: ResolvedVitendOptions = createOptions(options);\n\n const build: ResolvedBuildOptions = opts.build;\n\n const plugins: Plugin[] = [\n devPlugin({\n ...opts,\n }),\n buildPlugin({\n ...opts,\n }),\n ];\n\n if (build.target === \"default\" && build.copyPublicDir) {\n const copyOptions: CopyOptions = {\n targets: [\n {\n src: Path.resolve(build.publicDir, \"**\", \"*\"),\n dest: Path.resolve(build.outputDir, build.publicDir),\n },\n ],\n };\n\n if (opts.verbose) {\n copyOptions.onStart = (): void => {\n console.log(\"\");\n console.log(\"\");\n };\n\n copyOptions.onCopy = (event: CopyEvent): void => {\n const src: string = Path.relative(opts.cwd, event.target.src);\n\n const dest: string = Path.relative(opts.cwd, event.target.dest);\n\n let message: string = `${src} → ${dest}`;\n\n const flags: string[] = [];\n\n if (event.target.renamed) {\n flags.push(\"R\");\n }\n\n if (event.target.transformed) {\n flags.push(\"T\");\n }\n\n if (flags.length > 0) {\n message += ` [${flags.join(\",\")}]`;\n }\n\n log.success(message);\n };\n\n copyOptions.onEnd = (): void => {\n console.log(\"\");\n };\n }\n\n plugins.push(copy(copyOptions) as Plugin);\n }\n\n return plugins;\n};\n\nexport { vitend };\n"],"mappings":"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"}
1
+ {"version":3,"file":"vite.js","names":["Fs","Path","Path","Fs","Path","builtinModules","Path"],"sources":["../src/configs/log.ts","../src/functions/entry.ts","../src/functions/options.ts","../src/functions/package-json.ts","../src/functions/posix.ts","../src/functions/ssr.ts","../src/vite/build.ts","../src/vite/dev.ts","../src/vite/vitend.ts"],"sourcesContent":["import type { ConsolaInstance } from \"consola\";\n\nimport { createConsola } from \"consola\";\n\nconst log: ConsolaInstance = createConsola({\n formatOptions: {\n date: false,\n },\n});\n\nexport { log };\n","import * as Fs from \"node:fs\";\nimport * as Path from \"node:path\";\n\nconst ENTRY_DEFAULT: string[] = [\n \"./src/index.ts\",\n \"./src/index.js\",\n];\n\nconst getEntry = (cwd: string, entry?: string): string => {\n if (!entry) {\n for (const ent of ENTRY_DEFAULT) {\n if (Fs.existsSync(Path.resolve(cwd, ent))) {\n entry = ent;\n break;\n }\n }\n\n if (!entry) {\n throw new Error(\"No entry file found\");\n }\n }\n\n return Path.resolve(cwd, entry);\n};\n\nexport { getEntry };\n","import type { Omit } from \"ts-vista\";\n\nimport type { VitendOptions } from \"#/@types/options/default\";\nimport type {\n ResolvedDefaultBuildOptions,\n ResolvedVercelBuildOptions,\n ResolvedVitendOptions,\n} from \"#/@types/options/resolved\";\n\nimport { toMerged } from \"es-toolkit\";\n\nimport { getEntry } from \"#/functions/entry\";\n\nconst OPTIONS_BUILD_DEFAULT: ResolvedDefaultBuildOptions = {\n target: \"default\",\n host: \"localhost\",\n port: 3000,\n bundle: \"external\",\n outputDir: \"./dist\",\n outputFile: \"index.js\",\n minify: false,\n publicDir: \"./public\",\n copyPublicDir: false,\n};\n\nconst OPTIONS_BUILD_VERCEL: ResolvedVercelBuildOptions = {\n target: \"vercel\",\n bundle: \"external\",\n outputDir: \"./dist\",\n outputFile: \"index.js\",\n minify: false,\n};\n\nconst OPTIONS_DEFAULT: Omit<ResolvedVitendOptions, \"entry\" | \"build\"> = {\n cwd: process.cwd(),\n runtime: \"node\",\n dev: {\n host: \"localhost\",\n port: 3001,\n },\n verbose: false,\n};\n\nconst getDefaultOptions = (\n isVercel: boolean,\n): Omit<ResolvedVitendOptions, \"entry\"> => {\n return {\n ...OPTIONS_DEFAULT,\n build: isVercel ? OPTIONS_BUILD_VERCEL : OPTIONS_BUILD_DEFAULT,\n };\n};\n\nconst createOptions = (options?: VitendOptions): ResolvedVitendOptions => {\n const isVercel: boolean = options?.build?.target === \"vercel\";\n\n const merged = toMerged(getDefaultOptions(isVercel), options ?? {});\n\n return {\n ...merged,\n entry: getEntry(merged.cwd, options?.entry),\n };\n};\n\nexport { createOptions };\n","import type { Format, Partial } from \"ts-vista\";\n\nimport * as Fs from \"node:fs\";\nimport * as Path from \"node:path\";\n\ntype CompletePackageJson = {\n type: \"module\" | \"commonjs\";\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n peerDependencies: Record<string, string>;\n};\n\ntype PackageJson = Format<Partial<CompletePackageJson>>;\n\nconst getPackageJson = (cwd: string): PackageJson => {\n const path: string = Path.resolve(cwd, \"package.json\");\n\n if (!Fs.existsSync(path)) {\n throw new Error(\"Failed to find package.json\");\n }\n\n const rawPackageJson: string = Fs.readFileSync(path, \"utf-8\");\n\n return JSON.parse(rawPackageJson);\n};\n\nexport type { CompletePackageJson, PackageJson };\nexport { getPackageJson };\n","import * as Path from \"node:path\";\n\nconst toPosix = (path: string): string => {\n return path.split(Path.sep).join(Path.posix.sep);\n};\n\nexport { toPosix };\n","import type { SSRTarget } from \"vite\";\n\nimport type { Runtime } from \"#/@types/options/complete\";\n\nconst getSsrTarget = (runtime: Runtime): SSRTarget => {\n switch (runtime) {\n case \"workerd\":\n return \"webworker\";\n default:\n return \"node\";\n }\n};\n\nexport { getSsrTarget };\n","import type { LoadResult, ResolveIdResult } from \"rollup\";\nimport type { Plugin, UserConfig } from \"vite\";\n\nimport type {\n ResolvedBuildOptions,\n ResolvedVitendOptions,\n} from \"#/@types/options/resolved\";\nimport type { PackageJson } from \"#/functions/package-json\";\n\nimport { builtinModules } from \"node:module\";\n\nimport { toMerged } from \"es-toolkit\";\n\nimport { getPackageJson } from \"#/functions/package-json\";\nimport { toPosix } from \"#/functions/posix\";\nimport { getSsrTarget } from \"#/functions/ssr\";\n\nconst VIRTUAL_ENTRY = \"virtual:vitend-entry\" as const;\n\nconst VIRTUAL_ENTRY_RESOLVED = `\\0${VIRTUAL_ENTRY}` as const;\n\nconst buildPlugin = (opts: ResolvedVitendOptions): Plugin => {\n const build: ResolvedBuildOptions = opts.build;\n\n const packageJson: PackageJson = getPackageJson(opts.cwd);\n\n return {\n name: \"vitend/build\",\n apply: \"build\",\n config: (config: UserConfig): UserConfig => {\n let result: UserConfig = {};\n\n let baseConfig: UserConfig = {\n resolve: {\n conditions: [\n opts.runtime,\n ],\n },\n ssr: {\n target: getSsrTarget(opts.runtime),\n resolve: {\n conditions: [\n opts.runtime,\n ],\n },\n },\n build: {\n copyPublicDir: false,\n },\n };\n\n if (build.bundle === \"external\") {\n baseConfig = toMerged(baseConfig, {\n ssr: {\n external: true,\n noExternal: void 0,\n },\n });\n }\n\n if (build.bundle === \"standalone\") {\n baseConfig = toMerged(baseConfig, {\n ssr: {\n noExternal: true,\n },\n });\n }\n\n result = toMerged(baseConfig, config);\n\n const overrideConfig: UserConfig = {\n build: {\n ssr: true,\n outDir: build.outputDir,\n rollupOptions: {\n input: VIRTUAL_ENTRY,\n output: {\n entryFileNames: build.outputFile,\n format:\n packageJson.type === \"module\" ? \"esm\" : \"cjs\",\n },\n external: [\n ...builtinModules,\n /^node:/,\n ],\n },\n minify: build.minify,\n },\n };\n\n result = toMerged(result, overrideConfig);\n\n return result;\n },\n resolveId: (id: string): ResolveIdResult => {\n if (id !== VIRTUAL_ENTRY) return void 0;\n return VIRTUAL_ENTRY_RESOLVED;\n },\n load: async (id: string): Promise<LoadResult> => {\n if (id !== VIRTUAL_ENTRY_RESOLVED) return void 0;\n\n let code: string = \"\";\n\n code += `import options from \"${toPosix(opts.entry)}\";`;\n code += `import { serve } from \"vitend/runtime\";`;\n\n // vercel export\n\n if (build.target === \"vercel\") {\n code += `const server = serve({ ...options, manual: true });`;\n code += `export default server;`;\n\n return code;\n }\n\n // default export\n\n code += `serve({`;\n code += `...options,`;\n\n if (build.host !== \"localhost\")\n code += `hostname: \"${build.host}\",`;\n if (build.port !== 3000) code += `port: ${build.port},`;\n\n if (build.https) {\n code += `tls: {`;\n if (build.https.cert)\n code += `cert: \"${toPosix(build.https.cert)}\",`;\n if (build.https.key)\n code += `key: \"${toPosix(build.https.key)}\",`;\n if (build.https.passphrase)\n code += `passphrase: \"${toPosix(build.https.passphrase)}\",`;\n code += `},`;\n }\n\n code += `});`;\n\n return code;\n },\n };\n};\n\nexport { buildPlugin };\n","import type HTTP from \"node:http\";\n\nimport type { Server, ServerHandler, ServerOptions } from \"srvx\";\nimport type { Connect, Plugin, UserConfig, ViteDevServer } from \"vite\";\n\nimport type {\n ResolvedDevOptions,\n ResolvedHttpsOptions,\n ResolvedVitendOptions,\n} from \"#/@types/options/resolved\";\n\nimport { toMerged } from \"es-toolkit\";\nimport { serve } from \"srvx\";\n\nimport { getSsrTarget } from \"#/functions/ssr\";\n\ntype CreateMiddlewareOptions = {\n vite: ViteDevServer;\n server: Server;\n};\n\nconst createRequestHeaders = (headers: HTTP.IncomingHttpHeaders): Headers => {\n const result: Headers = new Headers();\n\n const entries: [\n string,\n string | string[] | undefined,\n ][] = Object.entries(headers);\n\n for (let i: number = 0; i < entries.length; i++) {\n const entry:\n | [\n string,\n string | string[] | undefined,\n ]\n | undefined = entries[i];\n\n if (entry === void 0) continue;\n\n const [key, value] = entry;\n\n // ignore HTTP/2 pseudo-headers\n if (key.startsWith(\":\")) continue;\n\n if (value === void 0) continue;\n\n if (Array.isArray(value)) {\n for (let j: number = 0; j < value.length; j++) {\n const vl: string | undefined = value[j];\n\n if (vl === void 0) continue;\n\n result.append(key, vl);\n }\n } else {\n result.set(key, value);\n }\n }\n\n return result;\n};\n\nconst createMiddleware = ({ vite, server }: CreateMiddlewareOptions) => {\n return async (\n req: Connect.IncomingMessage,\n res: HTTP.ServerResponse,\n _next: Connect.NextFunction,\n ): Promise<void> => {\n const isHttps: boolean =\n vite.config.server.https?.cert !== void 0 &&\n vite.config.server.https?.key !== void 0;\n\n const protocol: string = `http${isHttps ? \"s\" : \"\"}`;\n\n const host: string = process.env.HOST ?? \"localhost\";\n\n const port: number = vite.config.server.port;\n\n const path: string = req.url ?? \"\";\n\n const url: URL = new URL(`${protocol}://${host}:${port}${path}`);\n\n const body: Connect.IncomingMessage | undefined =\n req.method !== \"GET\" && req.method !== \"HEAD\" ? req : void 0;\n\n const request: Request = new Request(url, {\n method: req.method,\n headers: createRequestHeaders(req.headers),\n body,\n duplex: \"half\",\n } as RequestInit);\n\n const response: Response = await server.fetch(request);\n\n res.statusCode = response.status;\n\n response.headers.forEach((value: string, key: string): void => {\n res.setHeader(key, value);\n });\n\n if (!response.body) {\n res.end();\n return void 0;\n }\n\n const reader: ReadableStreamDefaultReader<Uint8Array<ArrayBuffer>> =\n response.body.getReader();\n\n const stream = async (): Promise<void> => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n res.write(value);\n }\n\n res.end();\n } catch {\n res.end();\n }\n };\n\n await stream();\n };\n};\n\ntype Middleware = ReturnType<typeof createMiddleware>;\n\nconst devPlugin = (opts: ResolvedVitendOptions): Plugin => {\n const dev: ResolvedDevOptions = opts.dev;\n const https: ResolvedHttpsOptions = opts.dev.https ?? {};\n\n return {\n name: \"vitend/dev\",\n apply: \"serve\",\n config(config: UserConfig): UserConfig {\n const devConfig: UserConfig = {\n resolve: {\n conditions: [\n opts.runtime,\n ],\n },\n ssr: {\n target: getSsrTarget(opts.runtime),\n resolve: {\n conditions: [\n opts.runtime,\n ],\n },\n },\n build: {\n ssr: true,\n rollupOptions: {\n input: opts.entry,\n },\n },\n server: {\n host: dev.host,\n port: dev.port,\n ...(https.cert !== void 0 && https.key !== void 0\n ? {\n https: {\n cert: https.cert,\n key: https.key,\n passphrase: https.passphrase,\n },\n }\n : {}),\n },\n };\n\n return toMerged(config, devConfig);\n },\n configureServer: async (vite: ViteDevServer): Promise<void> => {\n const serverOptions: ServerOptions = (\n await vite.ssrLoadModule(opts.entry)\n ).default;\n\n const server: Server<ServerHandler> = serve({\n // base\n gracefulShutdown: false,\n // user\n ...serverOptions,\n // override\n manual: true,\n hostname: dev.host,\n port: dev.port,\n tls: {\n cert: https.cert,\n key: https.key,\n passphrase: https.passphrase,\n },\n });\n\n const middleware: Middleware = createMiddleware({\n vite,\n server,\n });\n\n vite.middlewares.use(middleware);\n },\n };\n};\n\nexport { devPlugin };\n","import type { CopyEvent, Options as CopyOptions } from \"rolldown-plugin-copy\";\nimport type { Plugin } from \"vite\";\n\nimport type { VitendOptions } from \"#/@types/options/default\";\nimport type {\n ResolvedBuildOptions,\n ResolvedVitendOptions,\n} from \"#/@types/options/resolved\";\n\nimport * as Path from \"node:path\";\n\nimport { copy } from \"rolldown-plugin-copy\";\n\nimport { log } from \"#/configs/log\";\nimport { createOptions } from \"#/functions/options\";\nimport { buildPlugin } from \"#/vite/build\";\nimport { devPlugin } from \"#/vite/dev\";\n\n/**\n * The `vitend` plugin.\n *\n * ### Example\n *\n * ```ts\n * // ./vite.config.ts\n *\n * import { defineConfig } from \"vite\";\n * import { vitend } from \"vitend/vite\";\n *\n * export default defineConfig({\n * plugins: [\n * vitend(),\n * ],\n * });\n * ```\n */\nconst vitend = (options?: VitendOptions): Plugin[] => {\n const opts: ResolvedVitendOptions = createOptions(options);\n\n const build: ResolvedBuildOptions = opts.build;\n\n const plugins: Plugin[] = [\n devPlugin({\n ...opts,\n }),\n buildPlugin({\n ...opts,\n }),\n ];\n\n if (build.target === \"default\" && build.copyPublicDir) {\n const copyOptions: CopyOptions = {\n targets: [\n {\n src: Path.posix.join(build.publicDir, \"**\", \"*\"),\n dest: Path.posix.join(build.outputDir, build.publicDir),\n },\n ],\n };\n\n if (opts.verbose) {\n copyOptions.onStart = (): void => {\n console.log(\"\");\n console.log(\"\");\n };\n\n copyOptions.onCopy = (event: CopyEvent): void => {\n const src: string = Path.relative(opts.cwd, event.target.src);\n\n const dest: string = Path.relative(opts.cwd, event.target.dest);\n\n let message: string = `${src} → ${dest}`;\n\n const flags: string[] = [];\n\n if (event.target.renamed) {\n flags.push(\"R\");\n }\n\n if (event.target.transformed) {\n flags.push(\"T\");\n }\n\n if (flags.length > 0) {\n message += ` [${flags.join(\",\")}]`;\n }\n\n log.success(message);\n };\n\n copyOptions.onEnd = (): void => {\n console.log(\"\");\n };\n }\n\n plugins.push(copy(copyOptions) as Plugin);\n }\n\n return plugins;\n};\n\nexport { vitend };\n"],"mappings":"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"}
package/dist/vite.mjs CHANGED
@@ -68,6 +68,10 @@ const getPackageJson = (cwd) => {
68
68
  return JSON.parse(rawPackageJson);
69
69
  };
70
70
 
71
+ const toPosix = (path) => {
72
+ return path.split(Path.sep).join(Path.posix.sep);
73
+ };
74
+
71
75
  const getSsrTarget = (runtime) => {
72
76
  switch (runtime) {
73
77
  case "workerd": return "webworker";
@@ -122,7 +126,7 @@ const buildPlugin = (opts) => {
122
126
  load: async (id) => {
123
127
  if (id !== VIRTUAL_ENTRY_RESOLVED) return void 0;
124
128
  let code = "";
125
- code += `import options from "${opts.entry}";`;
129
+ code += `import options from "${toPosix(opts.entry)}";`;
126
130
  code += `import { serve } from "vitend/runtime";`;
127
131
  if (build.target === "vercel") {
128
132
  code += `const server = serve({ ...options, manual: true });`;
@@ -135,9 +139,9 @@ const buildPlugin = (opts) => {
135
139
  if (build.port !== 3e3) code += `port: ${build.port},`;
136
140
  if (build.https) {
137
141
  code += `tls: {`;
138
- if (build.https.cert) code += `cert: "${build.https.cert}",`;
139
- if (build.https.key) code += `key: "${build.https.key}",`;
140
- if (build.https.passphrase) code += `passphrase: "${build.https.passphrase}",`;
142
+ if (build.https.cert) code += `cert: "${toPosix(build.https.cert)}",`;
143
+ if (build.https.key) code += `key: "${toPosix(build.https.key)}",`;
144
+ if (build.https.passphrase) code += `passphrase: "${toPosix(build.https.passphrase)}",`;
141
145
  code += `},`;
142
146
  }
143
147
  code += `});`;
@@ -277,8 +281,8 @@ const vitend = (options) => {
277
281
  const plugins = [devPlugin({ ...opts }), buildPlugin({ ...opts })];
278
282
  if (build.target === "default" && build.copyPublicDir) {
279
283
  const copyOptions = { targets: [{
280
- src: Path.resolve(build.publicDir, "**", "*"),
281
- dest: Path.resolve(build.outputDir, build.publicDir)
284
+ src: Path.posix.join(build.publicDir, "**", "*"),
285
+ dest: Path.posix.join(build.outputDir, build.publicDir)
282
286
  }] };
283
287
  if (opts.verbose) {
284
288
  copyOptions.onStart = () => {
package/dist/vite.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"vite.mjs","names":[],"sources":["../src/configs/log.ts","../src/functions/entry.ts","../src/functions/options.ts","../src/functions/package-json.ts","../src/functions/ssr.ts","../src/vite/build.ts","../src/vite/dev.ts","../src/vite/vitend.ts"],"sourcesContent":["import type { ConsolaInstance } from \"consola\";\n\nimport { createConsola } from \"consola\";\n\nconst log: ConsolaInstance = createConsola({\n formatOptions: {\n date: false,\n },\n});\n\nexport { log };\n","import * as Fs from \"node:fs\";\nimport * as Path from \"node:path\";\n\nconst ENTRY_DEFAULT: string[] = [\n \"./src/index.ts\",\n \"./src/index.js\",\n];\n\nconst getEntry = (cwd: string, entry?: string): string => {\n if (!entry) {\n for (const ent of ENTRY_DEFAULT) {\n if (Fs.existsSync(Path.resolve(cwd, ent))) {\n entry = ent;\n break;\n }\n }\n\n if (!entry) {\n throw new Error(\"No entry file found\");\n }\n }\n\n return Path.resolve(cwd, entry);\n};\n\nexport { getEntry };\n","import type { Omit } from \"ts-vista\";\n\nimport type { VitendOptions } from \"#/@types/options/default\";\nimport type {\n ResolvedDefaultBuildOptions,\n ResolvedVercelBuildOptions,\n ResolvedVitendOptions,\n} from \"#/@types/options/resolved\";\n\nimport { toMerged } from \"es-toolkit\";\n\nimport { getEntry } from \"#/functions/entry\";\n\nconst OPTIONS_BUILD_DEFAULT: ResolvedDefaultBuildOptions = {\n target: \"default\",\n host: \"localhost\",\n port: 3000,\n bundle: \"external\",\n outputDir: \"./dist\",\n outputFile: \"index.js\",\n minify: false,\n publicDir: \"./public\",\n copyPublicDir: false,\n};\n\nconst OPTIONS_BUILD_VERCEL: ResolvedVercelBuildOptions = {\n target: \"vercel\",\n bundle: \"external\",\n outputDir: \"./dist\",\n outputFile: \"index.js\",\n minify: false,\n};\n\nconst OPTIONS_DEFAULT: Omit<ResolvedVitendOptions, \"entry\" | \"build\"> = {\n cwd: process.cwd(),\n runtime: \"node\",\n dev: {\n host: \"localhost\",\n port: 3001,\n },\n verbose: false,\n};\n\nconst getDefaultOptions = (\n isVercel: boolean,\n): Omit<ResolvedVitendOptions, \"entry\"> => {\n return {\n ...OPTIONS_DEFAULT,\n build: isVercel ? OPTIONS_BUILD_VERCEL : OPTIONS_BUILD_DEFAULT,\n };\n};\n\nconst createOptions = (options?: VitendOptions): ResolvedVitendOptions => {\n const isVercel: boolean = options?.build?.target === \"vercel\";\n\n const merged = toMerged(getDefaultOptions(isVercel), options ?? {});\n\n return {\n ...merged,\n entry: getEntry(merged.cwd, options?.entry),\n };\n};\n\nexport { createOptions };\n","import type { Format, Partial } from \"ts-vista\";\n\nimport * as Fs from \"node:fs\";\nimport * as Path from \"node:path\";\n\ntype CompletePackageJson = {\n type: \"module\" | \"commonjs\";\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n peerDependencies: Record<string, string>;\n};\n\ntype PackageJson = Format<Partial<CompletePackageJson>>;\n\nconst getPackageJson = (cwd: string): PackageJson => {\n const path: string = Path.resolve(cwd, \"package.json\");\n\n if (!Fs.existsSync(path)) {\n throw new Error(\"Failed to find package.json\");\n }\n\n const rawPackageJson: string = Fs.readFileSync(path, \"utf-8\");\n\n return JSON.parse(rawPackageJson);\n};\n\nexport type { CompletePackageJson, PackageJson };\nexport { getPackageJson };\n","import type { SSRTarget } from \"vite\";\n\nimport type { Runtime } from \"#/@types/options/complete\";\n\nconst getSsrTarget = (runtime: Runtime): SSRTarget => {\n switch (runtime) {\n case \"workerd\":\n return \"webworker\";\n default:\n return \"node\";\n }\n};\n\nexport { getSsrTarget };\n","import type { LoadResult, ResolveIdResult } from \"rollup\";\nimport type { Plugin, UserConfig } from \"vite\";\n\nimport type {\n ResolvedBuildOptions,\n ResolvedVitendOptions,\n} from \"#/@types/options/resolved\";\nimport type { PackageJson } from \"#/functions/package-json\";\n\nimport { builtinModules } from \"node:module\";\n\nimport { toMerged } from \"es-toolkit\";\n\nimport { getPackageJson } from \"#/functions/package-json\";\nimport { getSsrTarget } from \"#/functions/ssr\";\n\nconst VIRTUAL_ENTRY = \"virtual:vitend-entry\" as const;\n\nconst VIRTUAL_ENTRY_RESOLVED = `\\0${VIRTUAL_ENTRY}` as const;\n\nconst buildPlugin = (opts: ResolvedVitendOptions): Plugin => {\n const build: ResolvedBuildOptions = opts.build;\n\n const packageJson: PackageJson = getPackageJson(opts.cwd);\n\n return {\n name: \"vitend/build\",\n apply: \"build\",\n config: (config: UserConfig): UserConfig => {\n let result: UserConfig = {};\n\n let baseConfig: UserConfig = {\n resolve: {\n conditions: [\n opts.runtime,\n ],\n },\n ssr: {\n target: getSsrTarget(opts.runtime),\n resolve: {\n conditions: [\n opts.runtime,\n ],\n },\n },\n build: {\n copyPublicDir: false,\n },\n };\n\n if (build.bundle === \"external\") {\n baseConfig = toMerged(baseConfig, {\n ssr: {\n external: true,\n noExternal: void 0,\n },\n });\n }\n\n if (build.bundle === \"standalone\") {\n baseConfig = toMerged(baseConfig, {\n ssr: {\n noExternal: true,\n },\n });\n }\n\n result = toMerged(baseConfig, config);\n\n const overrideConfig: UserConfig = {\n build: {\n ssr: true,\n outDir: build.outputDir,\n rollupOptions: {\n input: VIRTUAL_ENTRY,\n output: {\n entryFileNames: build.outputFile,\n format:\n packageJson.type === \"module\" ? \"esm\" : \"cjs\",\n },\n external: [\n ...builtinModules,\n /^node:/,\n ],\n },\n minify: build.minify,\n },\n };\n\n result = toMerged(result, overrideConfig);\n\n return result;\n },\n resolveId: (id: string): ResolveIdResult => {\n if (id !== VIRTUAL_ENTRY) return void 0;\n return VIRTUAL_ENTRY_RESOLVED;\n },\n load: async (id: string): Promise<LoadResult> => {\n if (id !== VIRTUAL_ENTRY_RESOLVED) return void 0;\n\n let code: string = \"\";\n\n code += `import options from \"${opts.entry}\";`;\n code += `import { serve } from \"vitend/runtime\";`;\n\n // vercel export\n\n if (build.target === \"vercel\") {\n code += `const server = serve({ ...options, manual: true });`;\n code += `export default server;`;\n\n return code;\n }\n\n // default export\n\n code += `serve({`;\n code += `...options,`;\n\n if (build.host !== \"localhost\")\n code += `hostname: \"${build.host}\",`;\n if (build.port !== 3000) code += `port: ${build.port},`;\n\n if (build.https) {\n code += `tls: {`;\n if (build.https.cert) code += `cert: \"${build.https.cert}\",`;\n if (build.https.key) code += `key: \"${build.https.key}\",`;\n if (build.https.passphrase)\n code += `passphrase: \"${build.https.passphrase}\",`;\n code += `},`;\n }\n\n code += `});`;\n\n return code;\n },\n };\n};\n\nexport { buildPlugin };\n","import type HTTP from \"node:http\";\n\nimport type { Server, ServerHandler, ServerOptions } from \"srvx\";\nimport type { Connect, Plugin, UserConfig, ViteDevServer } from \"vite\";\n\nimport type {\n ResolvedDevOptions,\n ResolvedHttpsOptions,\n ResolvedVitendOptions,\n} from \"#/@types/options/resolved\";\n\nimport { toMerged } from \"es-toolkit\";\nimport { serve } from \"srvx\";\n\nimport { getSsrTarget } from \"#/functions/ssr\";\n\ntype CreateMiddlewareOptions = {\n vite: ViteDevServer;\n server: Server;\n};\n\nconst createRequestHeaders = (headers: HTTP.IncomingHttpHeaders): Headers => {\n const result: Headers = new Headers();\n\n const entries: [\n string,\n string | string[] | undefined,\n ][] = Object.entries(headers);\n\n for (let i: number = 0; i < entries.length; i++) {\n const entry:\n | [\n string,\n string | string[] | undefined,\n ]\n | undefined = entries[i];\n\n if (entry === void 0) continue;\n\n const [key, value] = entry;\n\n // ignore HTTP/2 pseudo-headers\n if (key.startsWith(\":\")) continue;\n\n if (value === void 0) continue;\n\n if (Array.isArray(value)) {\n for (let j: number = 0; j < value.length; j++) {\n const vl: string | undefined = value[j];\n\n if (vl === void 0) continue;\n\n result.append(key, vl);\n }\n } else {\n result.set(key, value);\n }\n }\n\n return result;\n};\n\nconst createMiddleware = ({ vite, server }: CreateMiddlewareOptions) => {\n return async (\n req: Connect.IncomingMessage,\n res: HTTP.ServerResponse,\n _next: Connect.NextFunction,\n ): Promise<void> => {\n const isHttps: boolean =\n vite.config.server.https?.cert !== void 0 &&\n vite.config.server.https?.key !== void 0;\n\n const protocol: string = `http${isHttps ? \"s\" : \"\"}`;\n\n const host: string = process.env.HOST ?? \"localhost\";\n\n const port: number = vite.config.server.port;\n\n const path: string = req.url ?? \"\";\n\n const url: URL = new URL(`${protocol}://${host}:${port}${path}`);\n\n const body: Connect.IncomingMessage | undefined =\n req.method !== \"GET\" && req.method !== \"HEAD\" ? req : void 0;\n\n const request: Request = new Request(url, {\n method: req.method,\n headers: createRequestHeaders(req.headers),\n body,\n duplex: \"half\",\n } as RequestInit);\n\n const response: Response = await server.fetch(request);\n\n res.statusCode = response.status;\n\n response.headers.forEach((value: string, key: string): void => {\n res.setHeader(key, value);\n });\n\n if (!response.body) {\n res.end();\n return void 0;\n }\n\n const reader: ReadableStreamDefaultReader<Uint8Array<ArrayBuffer>> =\n response.body.getReader();\n\n const stream = async (): Promise<void> => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n res.write(value);\n }\n\n res.end();\n } catch {\n res.end();\n }\n };\n\n await stream();\n };\n};\n\ntype Middleware = ReturnType<typeof createMiddleware>;\n\nconst devPlugin = (opts: ResolvedVitendOptions): Plugin => {\n const dev: ResolvedDevOptions = opts.dev;\n const https: ResolvedHttpsOptions = opts.dev.https ?? {};\n\n return {\n name: \"vitend/dev\",\n apply: \"serve\",\n config(config: UserConfig): UserConfig {\n const devConfig: UserConfig = {\n resolve: {\n conditions: [\n opts.runtime,\n ],\n },\n ssr: {\n target: getSsrTarget(opts.runtime),\n resolve: {\n conditions: [\n opts.runtime,\n ],\n },\n },\n build: {\n ssr: true,\n rollupOptions: {\n input: opts.entry,\n },\n },\n server: {\n host: dev.host,\n port: dev.port,\n ...(https.cert !== void 0 && https.key !== void 0\n ? {\n https: {\n cert: https.cert,\n key: https.key,\n passphrase: https.passphrase,\n },\n }\n : {}),\n },\n };\n\n return toMerged(config, devConfig);\n },\n configureServer: async (vite: ViteDevServer): Promise<void> => {\n const serverOptions: ServerOptions = (\n await vite.ssrLoadModule(opts.entry)\n ).default;\n\n const server: Server<ServerHandler> = serve({\n // base\n gracefulShutdown: false,\n // user\n ...serverOptions,\n // override\n manual: true,\n hostname: dev.host,\n port: dev.port,\n tls: {\n cert: https.cert,\n key: https.key,\n passphrase: https.passphrase,\n },\n });\n\n const middleware: Middleware = createMiddleware({\n vite,\n server,\n });\n\n vite.middlewares.use(middleware);\n },\n };\n};\n\nexport { devPlugin };\n","import type { CopyEvent, Options as CopyOptions } from \"rolldown-plugin-copy\";\nimport type { Plugin } from \"vite\";\n\nimport type { VitendOptions } from \"#/@types/options/default\";\nimport type {\n ResolvedBuildOptions,\n ResolvedVitendOptions,\n} from \"#/@types/options/resolved\";\n\nimport * as Path from \"node:path\";\n\nimport { copy } from \"rolldown-plugin-copy\";\n\nimport { log } from \"#/configs/log\";\nimport { createOptions } from \"#/functions/options\";\nimport { buildPlugin } from \"#/vite/build\";\nimport { devPlugin } from \"#/vite/dev\";\n\n/**\n * The `vitend` plugin.\n *\n * ### Example\n *\n * ```ts\n * // ./vite.config.ts\n *\n * import { defineConfig } from \"vite\";\n * import { vitend } from \"vitend/vite\";\n *\n * export default defineConfig({\n * plugins: [\n * vitend(),\n * ],\n * });\n * ```\n */\nconst vitend = (options?: VitendOptions): Plugin[] => {\n const opts: ResolvedVitendOptions = createOptions(options);\n\n const build: ResolvedBuildOptions = opts.build;\n\n const plugins: Plugin[] = [\n devPlugin({\n ...opts,\n }),\n buildPlugin({\n ...opts,\n }),\n ];\n\n if (build.target === \"default\" && build.copyPublicDir) {\n const copyOptions: CopyOptions = {\n targets: [\n {\n src: Path.resolve(build.publicDir, \"**\", \"*\"),\n dest: Path.resolve(build.outputDir, build.publicDir),\n },\n ],\n };\n\n if (opts.verbose) {\n copyOptions.onStart = (): void => {\n console.log(\"\");\n console.log(\"\");\n };\n\n copyOptions.onCopy = (event: CopyEvent): void => {\n const src: string = Path.relative(opts.cwd, event.target.src);\n\n const dest: string = Path.relative(opts.cwd, event.target.dest);\n\n let message: string = `${src} → ${dest}`;\n\n const flags: string[] = [];\n\n if (event.target.renamed) {\n flags.push(\"R\");\n }\n\n if (event.target.transformed) {\n flags.push(\"T\");\n }\n\n if (flags.length > 0) {\n message += ` [${flags.join(\",\")}]`;\n }\n\n log.success(message);\n };\n\n copyOptions.onEnd = (): void => {\n console.log(\"\");\n };\n }\n\n plugins.push(copy(copyOptions) as Plugin);\n }\n\n return plugins;\n};\n\nexport { vitend };\n"],"mappings":"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"}
1
+ {"version":3,"file":"vite.mjs","names":[],"sources":["../src/configs/log.ts","../src/functions/entry.ts","../src/functions/options.ts","../src/functions/package-json.ts","../src/functions/posix.ts","../src/functions/ssr.ts","../src/vite/build.ts","../src/vite/dev.ts","../src/vite/vitend.ts"],"sourcesContent":["import type { ConsolaInstance } from \"consola\";\n\nimport { createConsola } from \"consola\";\n\nconst log: ConsolaInstance = createConsola({\n formatOptions: {\n date: false,\n },\n});\n\nexport { log };\n","import * as Fs from \"node:fs\";\nimport * as Path from \"node:path\";\n\nconst ENTRY_DEFAULT: string[] = [\n \"./src/index.ts\",\n \"./src/index.js\",\n];\n\nconst getEntry = (cwd: string, entry?: string): string => {\n if (!entry) {\n for (const ent of ENTRY_DEFAULT) {\n if (Fs.existsSync(Path.resolve(cwd, ent))) {\n entry = ent;\n break;\n }\n }\n\n if (!entry) {\n throw new Error(\"No entry file found\");\n }\n }\n\n return Path.resolve(cwd, entry);\n};\n\nexport { getEntry };\n","import type { Omit } from \"ts-vista\";\n\nimport type { VitendOptions } from \"#/@types/options/default\";\nimport type {\n ResolvedDefaultBuildOptions,\n ResolvedVercelBuildOptions,\n ResolvedVitendOptions,\n} from \"#/@types/options/resolved\";\n\nimport { toMerged } from \"es-toolkit\";\n\nimport { getEntry } from \"#/functions/entry\";\n\nconst OPTIONS_BUILD_DEFAULT: ResolvedDefaultBuildOptions = {\n target: \"default\",\n host: \"localhost\",\n port: 3000,\n bundle: \"external\",\n outputDir: \"./dist\",\n outputFile: \"index.js\",\n minify: false,\n publicDir: \"./public\",\n copyPublicDir: false,\n};\n\nconst OPTIONS_BUILD_VERCEL: ResolvedVercelBuildOptions = {\n target: \"vercel\",\n bundle: \"external\",\n outputDir: \"./dist\",\n outputFile: \"index.js\",\n minify: false,\n};\n\nconst OPTIONS_DEFAULT: Omit<ResolvedVitendOptions, \"entry\" | \"build\"> = {\n cwd: process.cwd(),\n runtime: \"node\",\n dev: {\n host: \"localhost\",\n port: 3001,\n },\n verbose: false,\n};\n\nconst getDefaultOptions = (\n isVercel: boolean,\n): Omit<ResolvedVitendOptions, \"entry\"> => {\n return {\n ...OPTIONS_DEFAULT,\n build: isVercel ? OPTIONS_BUILD_VERCEL : OPTIONS_BUILD_DEFAULT,\n };\n};\n\nconst createOptions = (options?: VitendOptions): ResolvedVitendOptions => {\n const isVercel: boolean = options?.build?.target === \"vercel\";\n\n const merged = toMerged(getDefaultOptions(isVercel), options ?? {});\n\n return {\n ...merged,\n entry: getEntry(merged.cwd, options?.entry),\n };\n};\n\nexport { createOptions };\n","import type { Format, Partial } from \"ts-vista\";\n\nimport * as Fs from \"node:fs\";\nimport * as Path from \"node:path\";\n\ntype CompletePackageJson = {\n type: \"module\" | \"commonjs\";\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n peerDependencies: Record<string, string>;\n};\n\ntype PackageJson = Format<Partial<CompletePackageJson>>;\n\nconst getPackageJson = (cwd: string): PackageJson => {\n const path: string = Path.resolve(cwd, \"package.json\");\n\n if (!Fs.existsSync(path)) {\n throw new Error(\"Failed to find package.json\");\n }\n\n const rawPackageJson: string = Fs.readFileSync(path, \"utf-8\");\n\n return JSON.parse(rawPackageJson);\n};\n\nexport type { CompletePackageJson, PackageJson };\nexport { getPackageJson };\n","import * as Path from \"node:path\";\n\nconst toPosix = (path: string): string => {\n return path.split(Path.sep).join(Path.posix.sep);\n};\n\nexport { toPosix };\n","import type { SSRTarget } from \"vite\";\n\nimport type { Runtime } from \"#/@types/options/complete\";\n\nconst getSsrTarget = (runtime: Runtime): SSRTarget => {\n switch (runtime) {\n case \"workerd\":\n return \"webworker\";\n default:\n return \"node\";\n }\n};\n\nexport { getSsrTarget };\n","import type { LoadResult, ResolveIdResult } from \"rollup\";\nimport type { Plugin, UserConfig } from \"vite\";\n\nimport type {\n ResolvedBuildOptions,\n ResolvedVitendOptions,\n} from \"#/@types/options/resolved\";\nimport type { PackageJson } from \"#/functions/package-json\";\n\nimport { builtinModules } from \"node:module\";\n\nimport { toMerged } from \"es-toolkit\";\n\nimport { getPackageJson } from \"#/functions/package-json\";\nimport { toPosix } from \"#/functions/posix\";\nimport { getSsrTarget } from \"#/functions/ssr\";\n\nconst VIRTUAL_ENTRY = \"virtual:vitend-entry\" as const;\n\nconst VIRTUAL_ENTRY_RESOLVED = `\\0${VIRTUAL_ENTRY}` as const;\n\nconst buildPlugin = (opts: ResolvedVitendOptions): Plugin => {\n const build: ResolvedBuildOptions = opts.build;\n\n const packageJson: PackageJson = getPackageJson(opts.cwd);\n\n return {\n name: \"vitend/build\",\n apply: \"build\",\n config: (config: UserConfig): UserConfig => {\n let result: UserConfig = {};\n\n let baseConfig: UserConfig = {\n resolve: {\n conditions: [\n opts.runtime,\n ],\n },\n ssr: {\n target: getSsrTarget(opts.runtime),\n resolve: {\n conditions: [\n opts.runtime,\n ],\n },\n },\n build: {\n copyPublicDir: false,\n },\n };\n\n if (build.bundle === \"external\") {\n baseConfig = toMerged(baseConfig, {\n ssr: {\n external: true,\n noExternal: void 0,\n },\n });\n }\n\n if (build.bundle === \"standalone\") {\n baseConfig = toMerged(baseConfig, {\n ssr: {\n noExternal: true,\n },\n });\n }\n\n result = toMerged(baseConfig, config);\n\n const overrideConfig: UserConfig = {\n build: {\n ssr: true,\n outDir: build.outputDir,\n rollupOptions: {\n input: VIRTUAL_ENTRY,\n output: {\n entryFileNames: build.outputFile,\n format:\n packageJson.type === \"module\" ? \"esm\" : \"cjs\",\n },\n external: [\n ...builtinModules,\n /^node:/,\n ],\n },\n minify: build.minify,\n },\n };\n\n result = toMerged(result, overrideConfig);\n\n return result;\n },\n resolveId: (id: string): ResolveIdResult => {\n if (id !== VIRTUAL_ENTRY) return void 0;\n return VIRTUAL_ENTRY_RESOLVED;\n },\n load: async (id: string): Promise<LoadResult> => {\n if (id !== VIRTUAL_ENTRY_RESOLVED) return void 0;\n\n let code: string = \"\";\n\n code += `import options from \"${toPosix(opts.entry)}\";`;\n code += `import { serve } from \"vitend/runtime\";`;\n\n // vercel export\n\n if (build.target === \"vercel\") {\n code += `const server = serve({ ...options, manual: true });`;\n code += `export default server;`;\n\n return code;\n }\n\n // default export\n\n code += `serve({`;\n code += `...options,`;\n\n if (build.host !== \"localhost\")\n code += `hostname: \"${build.host}\",`;\n if (build.port !== 3000) code += `port: ${build.port},`;\n\n if (build.https) {\n code += `tls: {`;\n if (build.https.cert)\n code += `cert: \"${toPosix(build.https.cert)}\",`;\n if (build.https.key)\n code += `key: \"${toPosix(build.https.key)}\",`;\n if (build.https.passphrase)\n code += `passphrase: \"${toPosix(build.https.passphrase)}\",`;\n code += `},`;\n }\n\n code += `});`;\n\n return code;\n },\n };\n};\n\nexport { buildPlugin };\n","import type HTTP from \"node:http\";\n\nimport type { Server, ServerHandler, ServerOptions } from \"srvx\";\nimport type { Connect, Plugin, UserConfig, ViteDevServer } from \"vite\";\n\nimport type {\n ResolvedDevOptions,\n ResolvedHttpsOptions,\n ResolvedVitendOptions,\n} from \"#/@types/options/resolved\";\n\nimport { toMerged } from \"es-toolkit\";\nimport { serve } from \"srvx\";\n\nimport { getSsrTarget } from \"#/functions/ssr\";\n\ntype CreateMiddlewareOptions = {\n vite: ViteDevServer;\n server: Server;\n};\n\nconst createRequestHeaders = (headers: HTTP.IncomingHttpHeaders): Headers => {\n const result: Headers = new Headers();\n\n const entries: [\n string,\n string | string[] | undefined,\n ][] = Object.entries(headers);\n\n for (let i: number = 0; i < entries.length; i++) {\n const entry:\n | [\n string,\n string | string[] | undefined,\n ]\n | undefined = entries[i];\n\n if (entry === void 0) continue;\n\n const [key, value] = entry;\n\n // ignore HTTP/2 pseudo-headers\n if (key.startsWith(\":\")) continue;\n\n if (value === void 0) continue;\n\n if (Array.isArray(value)) {\n for (let j: number = 0; j < value.length; j++) {\n const vl: string | undefined = value[j];\n\n if (vl === void 0) continue;\n\n result.append(key, vl);\n }\n } else {\n result.set(key, value);\n }\n }\n\n return result;\n};\n\nconst createMiddleware = ({ vite, server }: CreateMiddlewareOptions) => {\n return async (\n req: Connect.IncomingMessage,\n res: HTTP.ServerResponse,\n _next: Connect.NextFunction,\n ): Promise<void> => {\n const isHttps: boolean =\n vite.config.server.https?.cert !== void 0 &&\n vite.config.server.https?.key !== void 0;\n\n const protocol: string = `http${isHttps ? \"s\" : \"\"}`;\n\n const host: string = process.env.HOST ?? \"localhost\";\n\n const port: number = vite.config.server.port;\n\n const path: string = req.url ?? \"\";\n\n const url: URL = new URL(`${protocol}://${host}:${port}${path}`);\n\n const body: Connect.IncomingMessage | undefined =\n req.method !== \"GET\" && req.method !== \"HEAD\" ? req : void 0;\n\n const request: Request = new Request(url, {\n method: req.method,\n headers: createRequestHeaders(req.headers),\n body,\n duplex: \"half\",\n } as RequestInit);\n\n const response: Response = await server.fetch(request);\n\n res.statusCode = response.status;\n\n response.headers.forEach((value: string, key: string): void => {\n res.setHeader(key, value);\n });\n\n if (!response.body) {\n res.end();\n return void 0;\n }\n\n const reader: ReadableStreamDefaultReader<Uint8Array<ArrayBuffer>> =\n response.body.getReader();\n\n const stream = async (): Promise<void> => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) break;\n\n res.write(value);\n }\n\n res.end();\n } catch {\n res.end();\n }\n };\n\n await stream();\n };\n};\n\ntype Middleware = ReturnType<typeof createMiddleware>;\n\nconst devPlugin = (opts: ResolvedVitendOptions): Plugin => {\n const dev: ResolvedDevOptions = opts.dev;\n const https: ResolvedHttpsOptions = opts.dev.https ?? {};\n\n return {\n name: \"vitend/dev\",\n apply: \"serve\",\n config(config: UserConfig): UserConfig {\n const devConfig: UserConfig = {\n resolve: {\n conditions: [\n opts.runtime,\n ],\n },\n ssr: {\n target: getSsrTarget(opts.runtime),\n resolve: {\n conditions: [\n opts.runtime,\n ],\n },\n },\n build: {\n ssr: true,\n rollupOptions: {\n input: opts.entry,\n },\n },\n server: {\n host: dev.host,\n port: dev.port,\n ...(https.cert !== void 0 && https.key !== void 0\n ? {\n https: {\n cert: https.cert,\n key: https.key,\n passphrase: https.passphrase,\n },\n }\n : {}),\n },\n };\n\n return toMerged(config, devConfig);\n },\n configureServer: async (vite: ViteDevServer): Promise<void> => {\n const serverOptions: ServerOptions = (\n await vite.ssrLoadModule(opts.entry)\n ).default;\n\n const server: Server<ServerHandler> = serve({\n // base\n gracefulShutdown: false,\n // user\n ...serverOptions,\n // override\n manual: true,\n hostname: dev.host,\n port: dev.port,\n tls: {\n cert: https.cert,\n key: https.key,\n passphrase: https.passphrase,\n },\n });\n\n const middleware: Middleware = createMiddleware({\n vite,\n server,\n });\n\n vite.middlewares.use(middleware);\n },\n };\n};\n\nexport { devPlugin };\n","import type { CopyEvent, Options as CopyOptions } from \"rolldown-plugin-copy\";\nimport type { Plugin } from \"vite\";\n\nimport type { VitendOptions } from \"#/@types/options/default\";\nimport type {\n ResolvedBuildOptions,\n ResolvedVitendOptions,\n} from \"#/@types/options/resolved\";\n\nimport * as Path from \"node:path\";\n\nimport { copy } from \"rolldown-plugin-copy\";\n\nimport { log } from \"#/configs/log\";\nimport { createOptions } from \"#/functions/options\";\nimport { buildPlugin } from \"#/vite/build\";\nimport { devPlugin } from \"#/vite/dev\";\n\n/**\n * The `vitend` plugin.\n *\n * ### Example\n *\n * ```ts\n * // ./vite.config.ts\n *\n * import { defineConfig } from \"vite\";\n * import { vitend } from \"vitend/vite\";\n *\n * export default defineConfig({\n * plugins: [\n * vitend(),\n * ],\n * });\n * ```\n */\nconst vitend = (options?: VitendOptions): Plugin[] => {\n const opts: ResolvedVitendOptions = createOptions(options);\n\n const build: ResolvedBuildOptions = opts.build;\n\n const plugins: Plugin[] = [\n devPlugin({\n ...opts,\n }),\n buildPlugin({\n ...opts,\n }),\n ];\n\n if (build.target === \"default\" && build.copyPublicDir) {\n const copyOptions: CopyOptions = {\n targets: [\n {\n src: Path.posix.join(build.publicDir, \"**\", \"*\"),\n dest: Path.posix.join(build.outputDir, build.publicDir),\n },\n ],\n };\n\n if (opts.verbose) {\n copyOptions.onStart = (): void => {\n console.log(\"\");\n console.log(\"\");\n };\n\n copyOptions.onCopy = (event: CopyEvent): void => {\n const src: string = Path.relative(opts.cwd, event.target.src);\n\n const dest: string = Path.relative(opts.cwd, event.target.dest);\n\n let message: string = `${src} → ${dest}`;\n\n const flags: string[] = [];\n\n if (event.target.renamed) {\n flags.push(\"R\");\n }\n\n if (event.target.transformed) {\n flags.push(\"T\");\n }\n\n if (flags.length > 0) {\n message += ` [${flags.join(\",\")}]`;\n }\n\n log.success(message);\n };\n\n copyOptions.onEnd = (): void => {\n console.log(\"\");\n };\n }\n\n plugins.push(copy(copyOptions) as Plugin);\n }\n\n return plugins;\n};\n\nexport { vitend };\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/vitejs/vite-plugin-registry/refs/heads/main/data/schema/extended-package-json.schema.json",
3
3
  "name": "vitend",
4
- "version": "0.4.0",
4
+ "version": "0.4.1",
5
5
  "description": "A library for backend development with Vite",
6
6
  "keywords": [
7
7
  "vitend",