From d52d692dc3ed22e220dae3eec8d8700872061e37 Mon Sep 17 00:00:00 2001 From: Ross Robino Date: Thu, 12 Sep 2024 14:18:40 -0400 Subject: [PATCH] Deno (#20) * add deno adapter * create domco - deno * changeset * add docs * bump / doc --- .changeset/brave-cars-rush.md | 5 + .changeset/quiet-geese-marry.md | 5 + .../public/images/deno/build-settings.png | Bin 0 -> 128017 bytes apps/docs/src/content/deploy.md | 21 +- apps/docs/src/generated/globals.md | 42 ++-- package-lock.json | 5 +- packages/create-domco/package.json | 5 +- packages/create-domco/src/bin.ts | 100 +------- .../create-domco/src/dependencies/index.ts | 10 + packages/create-domco/src/index.ts | 192 ++++++++++++++- .../src/template-files/deno-json.ts | 49 ++++ .../src/template-files/favicon.ts | 35 +++ .../src/template-files/gitignore.ts | 27 +++ .../src/template-files/global-types.ts | 19 ++ .../src/template-files/package-json.ts | 48 ++++ .../src/template-files/page-html.ts | 37 +++ .../src/template-files/prettier.ts | 22 ++ .../src/template-files/style-css.ts | 19 ++ .../src/template-files/tailwind.ts | 22 ++ .../src/template-files/tsconfig-json.ts | 46 ++++ .../src/template-files/vite-config.ts | 30 +++ packages/create-domco/src/template/index.ts | 222 ------------------ packages/domco/package.json | 4 + .../domco/src/adapter/cloudflare/index.ts | 5 +- packages/domco/src/adapter/deno/index.ts | 78 ++++++ packages/domco/src/adapter/vercel/index.ts | 8 +- packages/domco/src/app/dev/index.ts | 11 +- packages/domco/src/app/index.ts | 10 +- packages/domco/src/app/mw/index.ts | 24 ++ packages/domco/src/app/util/index.ts | 2 +- packages/domco/src/plugin/config/index.ts | 24 +- packages/domco/src/types/public/index.ts | 25 +- .../domco/src/util/create-routes/index.ts | 2 +- packages/domco/src/version/index.ts | 2 +- 34 files changed, 765 insertions(+), 391 deletions(-) create mode 100644 .changeset/brave-cars-rush.md create mode 100644 .changeset/quiet-geese-marry.md create mode 100644 apps/docs/public/images/deno/build-settings.png create mode 100644 packages/create-domco/src/dependencies/index.ts create mode 100644 packages/create-domco/src/template-files/deno-json.ts create mode 100644 packages/create-domco/src/template-files/favicon.ts create mode 100644 packages/create-domco/src/template-files/gitignore.ts create mode 100644 packages/create-domco/src/template-files/global-types.ts create mode 100644 packages/create-domco/src/template-files/package-json.ts create mode 100644 packages/create-domco/src/template-files/page-html.ts create mode 100644 packages/create-domco/src/template-files/prettier.ts create mode 100644 packages/create-domco/src/template-files/style-css.ts create mode 100644 packages/create-domco/src/template-files/tailwind.ts create mode 100644 packages/create-domco/src/template-files/tsconfig-json.ts create mode 100644 packages/create-domco/src/template-files/vite-config.ts delete mode 100644 packages/create-domco/src/template/index.ts create mode 100644 packages/domco/src/adapter/deno/index.ts create mode 100644 packages/domco/src/app/mw/index.ts diff --git a/.changeset/brave-cars-rush.md b/.changeset/brave-cars-rush.md new file mode 100644 index 0000000..8ce590a --- /dev/null +++ b/.changeset/brave-cars-rush.md @@ -0,0 +1,5 @@ +--- +"domco": minor +--- + +Adds `deno deploy` adapter diff --git a/.changeset/quiet-geese-marry.md b/.changeset/quiet-geese-marry.md new file mode 100644 index 0000000..1e6ac9c --- /dev/null +++ b/.changeset/quiet-geese-marry.md @@ -0,0 +1,5 @@ +--- +"create-domco": patch +--- + +add `deno` as a pm -- detects and outputs deno project template diff --git a/apps/docs/public/images/deno/build-settings.png b/apps/docs/public/images/deno/build-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..6ac50eb245584d4b733943d954a9a068d60d165c GIT binary patch literal 128017 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 z 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 literal 0 HcmV?d00001 diff --git a/apps/docs/src/content/deploy.md b/apps/docs/src/content/deploy.md index 80e87fb..83e6878 100644 --- a/apps/docs/src/content/deploy.md +++ b/apps/docs/src/content/deploy.md @@ -68,19 +68,28 @@ export default defineConfig({ ### Cloudflare -The [Cloudflare](https://cloudflare.com) adapter outputs your app to work on Cloudflare Pages. +The [Cloudflare](https://cloudflare.com) adapter outputs your app to run on [Cloudflare Pages](https://pages.cloudflare.com/). + +- Function runs on [workerd](https://github.com/cloudflare/workerd). +- Outputs public assets to be served on Cloudflare's CDN. ![A screenshot of the Cloudflare Build Settings UI. Set the Framework Preset field to "None", set the build command to "npm run build", and the build output directory to ".cloudflare".](/_vercel/image?url=/images/cloudflare/build-settings.png&w=1280&q=100) -- Functions run on the [Workers Runtime](https://developers.cloudflare.com/workers/runtime-apis/). -- Outputs public assets to be served on Cloudflare's CDN. +### Deno + +The [Deno](https://deno.com) adapter outputs your app to run on [Deno Deploy](https://deno.com/deploy). + +- Function runs on Deno. +- Static files are served with [`@std/http/file-server`](https://jsr.io/@std/http). + +![A screenshot of the Deno Deploy Project Configuration UI. Set the Framework Preset field to "None", set the build command to "deno run -A npm:vite build", and the entrypoint to "dist/server/main.js".](/_vercel/image?url=/images/deno/build-settings.png&w=1280&q=100) ### Vercel The [Vercel](https://vercel.com) adapter outputs your app to the [Build Output API](https://vercel.com/docs/build-output-api/v3) specification. -![A screenshot of the Vercel Build and Development Settings UI. Set the Framework Preset field to "Other" and leave all of the other options blank.](/_vercel/image?url=/images/vercel/build-settings.png&w=1280&q=100) - -- Functions run on [Node.js](https://vercel.com/docs/functions/runtimes#node.js), [Node.js with ISR](https://vercel.com/docs/incremental-static-regeneration), or [Edge Runtime](https://vercel.com/docs/functions/runtimes/edge-runtime). +- Function runs on [Node.js](https://vercel.com/docs/functions/runtimes#node.js), [Node.js with ISR](https://vercel.com/docs/incremental-static-regeneration), or [Edge Runtime](https://vercel.com/docs/functions/runtimes/edge-runtime). - Outputs public assets to be served on Vercel's [Edge Network](https://vercel.com/docs/edge-network/overview). - Supports on demand [Image Optimization](https://vercel.com/docs/image-optimization) when configured in the adapter config. Set the `src` attribute of an image using the `/_vercel/image/...` [optimized URL format](https://vercel.com/docs/image-optimization#optimized-url-format). In `dev` and `preview` modes, domco will redirect to the original image. + +![A screenshot of the Vercel Build and Development Settings UI. Set the Framework Preset field to "Other" and leave all of the other options blank.](/_vercel/image?url=/images/vercel/build-settings.png&w=1280&q=100) diff --git a/apps/docs/src/generated/globals.md b/apps/docs/src/generated/globals.md index 68b6c06..e9d492b 100644 --- a/apps/docs/src/generated/globals.md +++ b/apps/docs/src/generated/globals.md @@ -42,6 +42,14 @@ Message to log when the build is complete. The name of the adapter. + + +##### noExternal? + +> `optional` **noExternal**: `SSROptions`\[`"noExternal"`\] + +Passed into Vite `config.ssr.noExternal`. + ##### previewMiddleware? @@ -64,17 +72,17 @@ The script to run after Vite build is complete. `any` - + -##### ssrTarget +##### target? -> **ssrTarget**: `SSRTarget` +> `optional` **target**: `SSRTarget` -Target for SSR build. +Passed into Vite `config.ssr.target`. #### Defined in -[types/public/index.ts:44](https://github.com/rossrobino/domco/blob/fde430c2d32883df987ac54237edd49a27dfdd7e/packages/domco/src/types/public/index.ts#L44) +[types/public/index.ts:44](https://github.com/rossrobino/domco/blob/b818d1141c9ab3d2c6ee8351170a98e520e95923/packages/domco/src/types/public/index.ts#L44) --- @@ -86,7 +94,7 @@ Target for SSR build. #### Type Parameters -• **AdapterOptions** = `object` +• **AdapterOptions** = `never` #### Parameters @@ -98,7 +106,7 @@ Target for SSR build. #### Defined in -[types/public/index.ts:83](https://github.com/rossrobino/domco/blob/fde430c2d32883df987ac54237edd49a27dfdd7e/packages/domco/src/types/public/index.ts#L83) +[types/public/index.ts:78](https://github.com/rossrobino/domco/blob/b818d1141c9ab3d2c6ee8351170a98e520e95923/packages/domco/src/types/public/index.ts#L78) --- @@ -140,7 +148,7 @@ The name of the entrypoint without extension. #### Defined in -[types/public/index.ts:29](https://github.com/rossrobino/domco/blob/fde430c2d32883df987ac54237edd49a27dfdd7e/packages/domco/src/types/public/index.ts#L29) +[types/public/index.ts:29](https://github.com/rossrobino/domco/blob/b818d1141c9ab3d2c6ee8351170a98e520e95923/packages/domco/src/types/public/index.ts#L29) --- @@ -160,7 +168,7 @@ The name of the entrypoint without extension. #### Defined in -[types/public/index.ts:146](https://github.com/rossrobino/domco/blob/fde430c2d32883df987ac54237edd49a27dfdd7e/packages/domco/src/types/public/index.ts#L146) +[types/public/index.ts:141](https://github.com/rossrobino/domco/blob/b818d1141c9ab3d2c6ee8351170a98e520e95923/packages/domco/src/types/public/index.ts#L141) --- @@ -190,7 +198,7 @@ Path to apply the middleware to. #### Defined in -[types/public/index.ts:7](https://github.com/rossrobino/domco/blob/fde430c2d32883df987ac54237edd49a27dfdd7e/packages/domco/src/types/public/index.ts#L7) +[types/public/index.ts:7](https://github.com/rossrobino/domco/blob/b818d1141c9ab3d2c6ee8351170a98e520e95923/packages/domco/src/types/public/index.ts#L7) --- @@ -229,7 +237,7 @@ inject middleware. #### Defined in -[types/public/index.ts:15](https://github.com/rossrobino/domco/blob/fde430c2d32883df987ac54237edd49a27dfdd7e/packages/domco/src/types/public/index.ts#L15) +[types/public/index.ts:15](https://github.com/rossrobino/domco/blob/b818d1141c9ab3d2c6ee8351170a98e520e95923/packages/domco/src/types/public/index.ts#L15) --- @@ -286,7 +294,7 @@ export default defineConfig({ #### Defined in -[types/public/index.ts:109](https://github.com/rossrobino/domco/blob/fde430c2d32883df987ac54237edd49a27dfdd7e/packages/domco/src/types/public/index.ts#L109) +[types/public/index.ts:104](https://github.com/rossrobino/domco/blob/b818d1141c9ab3d2c6ee8351170a98e520e95923/packages/domco/src/types/public/index.ts#L104) --- @@ -447,7 +455,7 @@ declare module "hono" { #### Defined in -[types/public/index.ts:171](https://github.com/rossrobino/domco/blob/fde430c2d32883df987ac54237edd49a27dfdd7e/packages/domco/src/types/public/index.ts#L171) +[types/public/index.ts:166](https://github.com/rossrobino/domco/blob/b818d1141c9ab3d2c6ee8351170a98e520e95923/packages/domco/src/types/public/index.ts#L166) --- @@ -467,7 +475,7 @@ declare module "hono" { #### Defined in -[types/public/index.ts:144](https://github.com/rossrobino/domco/blob/fde430c2d32883df987ac54237edd49a27dfdd7e/packages/domco/src/types/public/index.ts#L144) +[types/public/index.ts:139](https://github.com/rossrobino/domco/blob/b818d1141c9ab3d2c6ee8351170a98e520e95923/packages/domco/src/types/public/index.ts#L139) --- @@ -494,7 +502,7 @@ export const prerender: Prerender = ["/", "/post-1", "/post-2"]; #### Defined in -[types/public/index.ts:142](https://github.com/rossrobino/domco/blob/fde430c2d32883df987ac54237edd49a27dfdd7e/packages/domco/src/types/public/index.ts#L142) +[types/public/index.ts:137](https://github.com/rossrobino/domco/blob/b818d1141c9ab3d2c6ee8351170a98e520e95923/packages/domco/src/types/public/index.ts#L137) --- @@ -516,7 +524,7 @@ export const prerender: Prerender = ["/", "/post-1", "/post-2"]; #### Defined in -[types/public/index.ts:148](https://github.com/rossrobino/domco/blob/fde430c2d32883df987ac54237edd49a27dfdd7e/packages/domco/src/types/public/index.ts#L148) +[types/public/index.ts:143](https://github.com/rossrobino/domco/blob/b818d1141c9ab3d2c6ee8351170a98e520e95923/packages/domco/src/types/public/index.ts#L143) ## Functions @@ -553,4 +561,4 @@ export default defineConfig({ #### Defined in -[plugin/index.ts:31](https://github.com/rossrobino/domco/blob/fde430c2d32883df987ac54237edd49a27dfdd7e/packages/domco/src/plugin/index.ts#L31) +[plugin/index.ts:31](https://github.com/rossrobino/domco/blob/b818d1141c9ab3d2c6ee8351170a98e520e95923/packages/domco/src/plugin/index.ts#L31) diff --git a/package-lock.json b/package-lock.json index 70e08f6..4b73915 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1148,7 +1148,6 @@ }, "node_modules/@clack/prompts/node_modules/is-unicode-supported": { "version": "1.3.0", - "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -6126,7 +6125,7 @@ } }, "packages/create-domco": { - "version": "0.1.10", + "version": "0.1.13", "license": "MIT", "dependencies": { "@clack/prompts": "^0.7.0", @@ -6140,7 +6139,7 @@ } }, "packages/domco": { - "version": "0.9.1", + "version": "0.11.0", "license": "MIT", "devDependencies": { "typedoc": "^0.26.6", diff --git a/packages/create-domco/package.json b/packages/create-domco/package.json index 5c1aabb..fa93d0d 100644 --- a/packages/create-domco/package.json +++ b/packages/create-domco/package.json @@ -12,11 +12,12 @@ "LICENSE.md" ], "scripts": { - "test": "rm -rf ./create-domco-test && echo 'Create your project in `create-domco-test`\n\n' && node ./dist/bin.js", + "test:clean": "rm -rf ./create-domco-test", + "test": "build:js && npm run test:clean && echo 'Create your project in `create-domco-test`\n\n' && node ./dist/bin.js", "dev": "tsc --watch", "build:clean": "rm -rf ./dist", "build:js": "tsc", - "build": "npm run build:clean && npm run build:js" + "build": "npm run test:clean && npm run build:clean && npm run build:js" }, "author": { "name": "Ross Robino", diff --git a/packages/create-domco/src/bin.ts b/packages/create-domco/src/bin.ts index 64aaa4a..dea98ff 100644 --- a/packages/create-domco/src/bin.ts +++ b/packages/create-domco/src/bin.ts @@ -1,100 +1,4 @@ #!/usr/bin/env node -import { getFiles } from "./template/index.js"; -import * as p from "@clack/prompts"; -import { writeFile, mkdir } from "node:fs/promises"; -import { dirname, join } from "node:path"; -import process from "node:process"; -import whichPmRuns from "which-pm-runs"; +import { createDomco } from "./index.js"; -/** - * Writes an array of files to the specified directory. - * @param directory - the directory to write the files to - * @param files - the files to write - * @returns a Promise that resolves when all the files have been written - */ -const writeFiles = async ( - directory: string, - files: { name: string; contents: string }[], -) => { - return Promise.all( - files.map(async (file) => { - const filePath = join(directory, file.name); - const fileDirectory = dirname(filePath); - - // Ensure directory exists - await mkdir(fileDirectory, { recursive: true }); - - // Write file - return writeFile(filePath, file.contents); - }), - ); -}; - -const pm = whichPmRuns()?.name || "npm"; - -p.intro("Welcome to domco"); - -let dir = await p.text({ - message: "Where should your project be created?", - defaultValue: ".", - placeholder: "(Enter for current directory)", -}); - -if (p.isCancel(dir)) { - p.cancel("Operation cancelled."); - process.exit(0); -} else { - const lang = await p.select({ - message: "Select language", - options: [ - { label: "TypeScript", value: "ts" }, - { label: "JavaScript", value: "js" }, - ], - }); - - if (p.isCancel(lang)) { - p.cancel("Operation cancelled."); - process.exit(0); - } else { - const extras = await p.multiselect({ - message: "Select additional options (use arrow keys/space bar)", - required: false, - options: [ - { - value: "prettier", - label: "Add Prettier for formatting", - }, - { - value: "tailwind", - label: "Add TailwindCSS for styling", - }, - ], - }); - - if (p.isCancel(extras)) { - p.cancel("Operation cancelled."); - process.exit(0); - } else { - const prettier = extras.includes("prettier"); - const tailwind = extras.includes("tailwind"); - - const s = p.spinner(); - - s.start("Creating project"); - - await writeFiles( - dir, - getFiles({ lang: String(lang), prettier, tailwind }), - ); - - s.stop("Files created"); - - p.note( - `${dir === "." ? "" : `cd ${dir}\n`}${pm} install\n${pm} run dev`, - `Next steps`, - ); - - p.outro(`https://github.com/rossrobino/domco`); - } - } -} +createDomco(); diff --git a/packages/create-domco/src/dependencies/index.ts b/packages/create-domco/src/dependencies/index.ts new file mode 100644 index 0000000..5824f61 --- /dev/null +++ b/packages/create-domco/src/dependencies/index.ts @@ -0,0 +1,10 @@ +export const dependencies = { + domco: "0.12.0", + hono: "4.6.1", + autoprefixer: "10.4.20", + prettier: "3.3.3", + prettierTailwind: "0.6.6", + tailwind: "3.4.11", + typescript: "5.6.0", + vite: "5.4.3", +} as const; diff --git a/packages/create-domco/src/index.ts b/packages/create-domco/src/index.ts index cb0ff5c..731e7b3 100644 --- a/packages/create-domco/src/index.ts +++ b/packages/create-domco/src/index.ts @@ -1 +1,191 @@ -export {}; +import denoJson from "./template-files/deno-json.js"; +import favicon from "./template-files/favicon.js"; +import gitignore from "./template-files/gitignore.js"; +import globalTypes from "./template-files/global-types.js"; +import packageJson from "./template-files/package-json.js"; +import pageHtml from "./template-files/page-html.js"; +import prettier from "./template-files/prettier.js"; +import styleCss from "./template-files/style-css.js"; +import tailwind from "./template-files/tailwind.js"; +import tsconfigJson from "./template-files/tsconfig-json.js"; +import viteConfig from "./template-files/vite-config.js"; +import * as p from "@clack/prompts"; +import fs from "node:fs/promises"; +import path from "node:path"; +import process from "node:process"; +import whichPmRuns from "which-pm-runs"; + +type PackageManager = + | ("npm" | "bun" | "pnpm" | "yarn" | "deno") + | (string & {}); + +type TemplateFile = { name: string; contents: string }; + +type GetTemplateFileOptions = { + dir: string; + pm: PackageManager; + lang: string; + tailwind: boolean; + prettier: boolean; + projectName: string; +}; + +export type GetTemplateFile = ( + options: GetTemplateFileOptions, +) => TemplateFile[]; + +/** + * Programmatically create a new domco project. + */ +export const createDomco = async () => { + p.intro("Welcome to domco"); + + const dir = await p.text({ + message: "Where should your project be created?", + defaultValue: ".", + placeholder: "(Enter for current directory)", + }); + + if (p.isCancel(dir)) { + p.cancel("Operation cancelled."); + process.exit(0); + } + + const lang = await p.select({ + message: "Select language", + options: [ + { label: "TypeScript", value: "ts" }, + { label: "JavaScript", value: "js" }, + ], + }); + + if (p.isCancel(lang)) { + p.cancel("Operation cancelled."); + process.exit(0); + } + + const extras = await p.multiselect({ + message: "Select additional options (use arrow keys/space bar)", + required: false, + options: [ + { + value: "prettier", + label: "Add Prettier for formatting", + }, + { + value: "tailwind", + label: "Add TailwindCSS for styling", + }, + ], + }); + + if (p.isCancel(extras)) { + p.cancel("Operation cancelled."); + process.exit(0); + } + + const s = p.spinner(); + + s.start("Creating project"); + + const options: GetTemplateFileOptions = { + dir, + lang: String(lang), + prettier: extras.includes("prettier"), + tailwind: extras.includes("tailwind"), + pm: getPackageManager(), + projectName: getProjectName(dir), + }; + + await writeTemplateFiles(dir, getAllTemplateFiles(options)); + + s.stop("Files created"); + + p.note(getNote(options), "Next steps"); + + p.outro(`https://github.com/rossrobino/domco`); + + process.exit(0); +}; + +const getAllTemplateFiles: GetTemplateFile = (options) => { + const getTemplateFileFunctions = [ + denoJson, + favicon, + gitignore, + globalTypes, + packageJson, + pageHtml, + prettier, + styleCss, + tailwind, + tsconfigJson, + viteConfig, + ]; + + const allTemplateFiles: TemplateFile[] = []; + + for (const fn of getTemplateFileFunctions) { + allTemplateFiles.push(...fn(options)); + } + + return allTemplateFiles; +}; + +/** + * Writes an array of files to the specified directory. + * + * @param dir the directory to write the files to + * @param templateFiles the files to write + * @returns a Promise that resolves when all the files have been written + */ +const writeTemplateFiles = async ( + dir: string, + templateFiles: TemplateFile[], +) => { + return Promise.all( + templateFiles.map(async ({ name, contents }) => { + const filePath = path.join(dir, name); + const fileDirectory = path.dirname(filePath); + + // Ensure directory exists + await fs.mkdir(fileDirectory, { recursive: true }); + + // Write file + return fs.writeFile(filePath, contents); + }), + ); +}; + +/** Gets the current package manager. */ +const getPackageManager = (): PackageManager => { + if ("Deno" in globalThis) return "deno"; + + return whichPmRuns()?.name || "npm"; +}; + +/** + * After create instructions. + * + * @param options + * @returns the note as a string + */ +const getNote = ({ dir, pm }: GetTemplateFileOptions) => { + const cd = dir === "." ? "" : `cd ${dir}\n`; + const install = pm === "deno" ? "" : `${pm} install\n`; + const run = `${pm} run dev`; + + return `${cd}${install}${run}`; +}; + +/** + * Gets the project name for the package.json `name` field. + * + * @param dir directory to create the project in. + * @returns the project name + */ +const getProjectName = (dir: string) => { + if (dir === ".") dir = process.cwd(); + + return path.basename(dir); +}; diff --git a/packages/create-domco/src/template-files/deno-json.ts b/packages/create-domco/src/template-files/deno-json.ts new file mode 100644 index 0000000..21dfc31 --- /dev/null +++ b/packages/create-domco/src/template-files/deno-json.ts @@ -0,0 +1,49 @@ +import { dependencies } from "../dependencies/index.js"; +import type { GetTemplateFile } from "../index.js"; + +const getTemplateFiles: GetTemplateFile = ({ pm, prettier, tailwind }) => { + if (pm !== "deno") return []; + + return [ + { + name: "deno.json", + contents: `{ + "version": "0.0.0", + "tasks": { + "dev": "deno run -A npm:vite", + "check": "deno check src/", + "build": "deno run -A npm:vite build", + "preview": "deno run -A npm:vite preview"${ + prettier ? `,\n\t\t"format": "deno run -A npm:prettier --write ."` : "" + } + }, + "nodeModulesDir": true, + "imports": { + "domco": "npm:domco@^${dependencies.domco}", + "hono": "npm:hono@^${dependencies.hono}",${prettier ? `\n\t\t"prettier": "npm:prettier@^${dependencies.prettier}",` : ""}${ + prettier && tailwind + ? `\n\t\t"prettier-plugin-tailwindcss": "npm:prettier-plugin-tailwindcss@^${dependencies.prettierTailwind}",` + : "" + }${ + tailwind + ? `\n\t\t"tailwindcss": "npm:tailwindcss@^${dependencies.tailwind}",\n\t\t"autoprefixer": "npm:autoprefixer@^${dependencies.autoprefixer}",` + : "" + } + "vite": "npm:vite@^${dependencies.vite}" + }, + "compilerOptions": { + "checkJs": true, + "jsx": "react-jsx", + "jsxImportSource": "hono/jsx", + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true + } +} +`, + }, + ]; +}; + +export default getTemplateFiles; diff --git a/packages/create-domco/src/template-files/favicon.ts b/packages/create-domco/src/template-files/favicon.ts new file mode 100644 index 0000000..dc90133 --- /dev/null +++ b/packages/create-domco/src/template-files/favicon.ts @@ -0,0 +1,35 @@ +import type { GetTemplateFile } from "../index.js"; + +export const faviconFileName = "circle.svg"; + +const getTemplateFiles: GetTemplateFile = () => { + return [ + { + name: `public/${faviconFileName}`, + contents: ` + + + + + + + + + + +`, + }, + ]; +}; + +export default getTemplateFiles; diff --git a/packages/create-domco/src/template-files/gitignore.ts b/packages/create-domco/src/template-files/gitignore.ts new file mode 100644 index 0000000..7b48f9f --- /dev/null +++ b/packages/create-domco/src/template-files/gitignore.ts @@ -0,0 +1,27 @@ +import type { GetTemplateFile } from "../index.js"; + +const getTemplateFiles: GetTemplateFile = () => { + return [ + { + name: ".gitignore", + contents: `logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* +node_modules +dist +*.local +.vscode/* +!.vscode/extensions.json +.DS_Store +.vercel +.cloudflare +`, + }, + ]; +}; + +export default getTemplateFiles; diff --git a/packages/create-domco/src/template-files/global-types.ts b/packages/create-domco/src/template-files/global-types.ts new file mode 100644 index 0000000..fd0e408 --- /dev/null +++ b/packages/create-domco/src/template-files/global-types.ts @@ -0,0 +1,19 @@ +import type { GetTemplateFile } from "../index.js"; + +const getTemplateFiles: GetTemplateFile = () => { + return [ + { + name: "src/global.d.ts", + contents: `/// +import type { DomcoContextVariableMap } from "domco"; +import "hono"; + +declare module "hono" { + interface ContextVariableMap extends DomcoContextVariableMap {} +} +`, + }, + ]; +}; + +export default getTemplateFiles; diff --git a/packages/create-domco/src/template-files/package-json.ts b/packages/create-domco/src/template-files/package-json.ts new file mode 100644 index 0000000..622fc49 --- /dev/null +++ b/packages/create-domco/src/template-files/package-json.ts @@ -0,0 +1,48 @@ +import { dependencies } from "../dependencies/index.js"; +import type { GetTemplateFile } from "../index.js"; + +const getTemplateFiles: GetTemplateFile = ({ + prettier, + tailwind, + pm, + projectName, +}) => { + if (pm === "deno") return []; + + return [ + { + name: "package.json", + contents: `{ + "name": "${projectName}", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "check": "tsc", + "build": "vite build", + "preview": "vite preview"${ + prettier ? `,\n\t\t"format": "prettier --write ."` : "" + } + }, + "devDependencies": { + "domco": "^${dependencies.domco}", + "hono": "^${dependencies.hono}",${prettier ? `\n\t\t"prettier": "^${dependencies.prettier}",` : ""}${ + prettier && tailwind + ? `\n\t\t"prettier-plugin-tailwindcss": "^${dependencies.prettierTailwind}",` + : "" + }${ + tailwind + ? `\n\t\t"tailwindcss": "^${dependencies.tailwind}",\n\t\t"autoprefixer": "^${dependencies.autoprefixer}",` + : "" + } + "typescript": "^${dependencies.typescript}", + "vite": "^${dependencies.vite}" + } +} +`, + }, + ]; +}; + +export default getTemplateFiles; diff --git a/packages/create-domco/src/template-files/page-html.ts b/packages/create-domco/src/template-files/page-html.ts new file mode 100644 index 0000000..6b5348d --- /dev/null +++ b/packages/create-domco/src/template-files/page-html.ts @@ -0,0 +1,37 @@ +import type { GetTemplateFile } from "../index.js"; +import { faviconFileName } from "./favicon.js"; +import { styleFileName } from "./style-css.js"; + +const getTemplateFiles: GetTemplateFile = () => { + return [ + { + name: "src/+page.html", + contents: ` + + + + + + + Title + + + +
+
+

Hello World

+ +
+
+ + +`, + }, + ]; +}; + +export default getTemplateFiles; diff --git a/packages/create-domco/src/template-files/prettier.ts b/packages/create-domco/src/template-files/prettier.ts new file mode 100644 index 0000000..e7ed2a0 --- /dev/null +++ b/packages/create-domco/src/template-files/prettier.ts @@ -0,0 +1,22 @@ +import type { GetTemplateFile } from "../index.js"; + +const getTemplateFiles: GetTemplateFile = ({ prettier, tailwind }) => { + if (!prettier) return []; + + return [ + { + name: "prettier.config.js", + contents: `/** @type {import("prettier").Config} */ +export default { + useTabs: true,${ + tailwind ? `\n\tplugins: ["prettier-plugin-tailwindcss"],\n` : "" + }};\n`, + }, + { + name: ".prettierignore", + contents: `.DS_Store\nnode_modules\n/dist\n.env\n.env.*\npackage-lock.json\npnpm-lock.yaml\nyarn.lock\nbun.lockb\n.vercel\n.cloudflare\n`, + }, + ]; +}; + +export default getTemplateFiles; diff --git a/packages/create-domco/src/template-files/style-css.ts b/packages/create-domco/src/template-files/style-css.ts new file mode 100644 index 0000000..a982bc9 --- /dev/null +++ b/packages/create-domco/src/template-files/style-css.ts @@ -0,0 +1,19 @@ +import type { GetTemplateFile } from "../index.js"; + +export const styleFileName = "style.css"; + +const getTemplateFiles: GetTemplateFile = ({ tailwind }) => { + return [ + { + name: `src/${styleFileName}`, + contents: tailwind + ? `@tailwind base; +@tailwind components; +@tailwind utilities; +` + : ``, + }, + ]; +}; + +export default getTemplateFiles; diff --git a/packages/create-domco/src/template-files/tailwind.ts b/packages/create-domco/src/template-files/tailwind.ts new file mode 100644 index 0000000..6e94174 --- /dev/null +++ b/packages/create-domco/src/template-files/tailwind.ts @@ -0,0 +1,22 @@ +import type { GetTemplateFile } from "../index.js"; + +const getTemplateFiles: GetTemplateFile = ({ lang, tailwind }) => { + if (!tailwind) return []; + + return [ + { + name: `tailwind.config.${lang}`, + contents: `${ + lang === "ts" + ? `import type { Config } from "tailwindcss";\n` + : `/** @type {import("tailwindcss").Config} */` + } +export default { + content: ["./src/**/*.{html,js,ts,jsx,tsx}"], +}${lang === "ts" ? ` satisfies Config` : ``}; +`, + }, + ]; +}; + +export default getTemplateFiles; diff --git a/packages/create-domco/src/template-files/tsconfig-json.ts b/packages/create-domco/src/template-files/tsconfig-json.ts new file mode 100644 index 0000000..ebb5a21 --- /dev/null +++ b/packages/create-domco/src/template-files/tsconfig-json.ts @@ -0,0 +1,46 @@ +import type { GetTemplateFile } from "../index.js"; + +const getTemplateFiles: GetTemplateFile = ({ pm }) => { + if (pm === "deno") return []; + + return [ + { + name: "tsconfig.json", + contents: `{ + "compilerOptions": { + "target": "ESNext", + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "allowJs": true, + "checkJs": true, + "module": "Preserve", + "moduleResolution": "Bundler", + "verbatimModuleSyntax": true, + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + "jsxImportSource": "hono/jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + + /* Aliases */ + "paths": { + "@": ["./src"], + "@/*": ["./src/*"] + } + }, + "include": ["src"] +} +`, + }, + ]; +}; + +export default getTemplateFiles; diff --git a/packages/create-domco/src/template-files/vite-config.ts b/packages/create-domco/src/template-files/vite-config.ts new file mode 100644 index 0000000..79484d8 --- /dev/null +++ b/packages/create-domco/src/template-files/vite-config.ts @@ -0,0 +1,30 @@ +import type { GetTemplateFile } from "../index.js"; + +const getTemplateFiles: GetTemplateFile = ({ lang, tailwind, pm }) => { + // Required in vite 5 since no package.json in deno + // I think it is fixed in vite 6 - can just use ts + const ext = pm === "deno" ? `m${lang}` : lang; + + return [ + { + name: `vite.config.${ext}`, + contents: `import { defineConfig } from "vite"; +import { domco } from "domco"; +${ + tailwind + ? `import tailwindcss from "tailwindcss";\nimport autoprefixer from "autoprefixer";\n` + : `` +} +export default defineConfig({ + plugins: [domco()],${ + tailwind + ? `\n\tcss: {\n\t\tpostcss: {\n\t\t\tplugins: [tailwindcss(), autoprefixer()]\n\t\t}\n\t}` + : `` + } +}); +`, + }, + ]; +}; + +export default getTemplateFiles; diff --git a/packages/create-domco/src/template/index.ts b/packages/create-domco/src/template/index.ts deleted file mode 100644 index e8972e2..0000000 --- a/packages/create-domco/src/template/index.ts +++ /dev/null @@ -1,222 +0,0 @@ -const versions = { - domco: "0.11.0", - hono: "4.5.11", - autoprefixer: "10.4.20", - prettier: "3.3.3", - prettierTailwind: "0.5.14", - tailwind: "3.4.10", - typescript: "5.5.4", - vite: "5.4.2", -} as const; - -export const getFiles = (options: { - lang: string; - tailwind: boolean; - prettier: boolean; -}) => { - const { lang, tailwind, prettier } = options; - - const styleFileName = "style.css"; - - const files: { name: string; contents: string }[] = [ - { - name: "package.json", - contents: `{ - "name": "domco-project", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "check": "tsc", - "build": "vite build", - "preview": "vite preview"${ - prettier ? `,\n\t\t"format": "prettier --write ."` : `` - } - }, - "devDependencies": { - "domco": "^${versions.domco}", - "hono": "^${versions.hono}",${prettier ? `\n\t\t"prettier": "^${versions.prettier}",` : ""}${ - prettier && tailwind - ? `\n\t\t"prettier-plugin-tailwindcss": "^${versions.prettierTailwind}",` - : "" - }${ - tailwind - ? `\n\t\t"tailwindcss": "^${versions.tailwind}",\n\t\t"autoprefixer": "^${versions.autoprefixer}",` - : "" - } - "typescript": "^${versions.typescript}", - "vite": "^${versions.vite}" - } -} -`, - }, - { - name: "tsconfig.json", - contents: `{ - "compilerOptions": { - "target": "ESNext", - "lib": ["ESNext", "DOM", "DOM.Iterable"], - "skipLibCheck": true, - "allowJs": true, - "checkJs": true, - "module": "Preserve", - "moduleResolution": "Bundler", - "verbatimModuleSyntax": true, - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "moduleDetection": "force", - "noEmit": true, - "jsx": "react-jsx", - "jsxImportSource": "hono/jsx", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "noUncheckedIndexedAccess": true, - - /* Aliases */ - "paths": { - "@": ["./src"], - "@/*": ["./src/*"] - } - }, - "include": ["src"] -} -`, - }, - { - name: `vite.config.${lang}`, - contents: `import { defineConfig } from "vite"; -import { domco } from "domco"; -${ - tailwind - ? `import tailwindcss from "tailwindcss";\nimport autoprefixer from "autoprefixer";\n` - : `` -} -export default defineConfig({ - plugins: [domco()],${ - tailwind - ? `\n\tcss: {\n\t\tpostcss: {\n\t\t\tplugins: [tailwindcss(), autoprefixer()]\n\t\t}\n\t}` - : `` - } -}); -`, - }, - { - name: ".gitignore", - contents: `# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -*.local - -.vercel -.cloudflare - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? -`, - }, - { - name: "src/+page.html", - contents: ` - - - - - - - Title - - - -
-
-

Hello World

- -
-
- - -`, - }, - { - name: `src/${styleFileName}`, - contents: tailwind - ? `@tailwind base; -@tailwind components; -@tailwind utilities; -` - : ``, - }, - { - name: "public/vite.svg", - contents: ``, - }, - { - name: "src/global.d.ts", - contents: `/// -import type { DomcoContextVariableMap } from "domco"; -import "hono"; - -declare module "hono" { - interface ContextVariableMap extends DomcoContextVariableMap {} -} -`, - }, - ]; - - if (prettier) { - files.push({ - name: "prettier.config.js", - contents: `/** @type {import("prettier").Config} */ -export default { - useTabs: true,${ - tailwind ? `\n\tplugins: ["prettier-plugin-tailwindcss"],\n` : "" - }};`, - }); - files.push({ - name: ".prettierignore", - contents: `.DS_Store\nnode_modules\n/dist\n.env\n.env.*\npackage-lock.json\npnpm-lock.yaml\nyarn.lock\nbun.lockb\n`, - }); - } - - if (tailwind) { - files.push({ - name: `tailwind.config.${lang}`, - contents: `${ - lang === "ts" - ? `import type { Config } from "tailwindcss";\n` - : `/** @type {import("tailwindcss").Config} */` - } -export default { - content: ["./src/**/*.{html,js,ts,jsx,tsx}"], -}${lang === "ts" ? ` satisfies Config` : ``}; -`, - }); - } - - return files; -}; diff --git a/packages/domco/package.json b/packages/domco/package.json index e422dc9..749892a 100644 --- a/packages/domco/package.json +++ b/packages/domco/package.json @@ -33,6 +33,10 @@ "types": "./dist/adapter/cloudflare/index.d.ts", "default": "./dist/adapter/cloudflare/index.js" }, + "./adapter/deno": { + "types": "./dist/adapter/deno/index.d.ts", + "default": "./dist/adapter/deno/index.js" + }, "./adapter/vercel": { "types": "./dist/adapter/vercel/index.d.ts", "default": "./dist/adapter/vercel/index.js" diff --git a/packages/domco/src/adapter/cloudflare/index.ts b/packages/domco/src/adapter/cloudflare/index.ts index d5ec1e4..251e48c 100644 --- a/packages/domco/src/adapter/cloudflare/index.ts +++ b/packages/domco/src/adapter/cloudflare/index.ts @@ -35,7 +35,8 @@ import process from "node:process"; export const adapter: AdapterBuilder = async () => { return { name: "cloudflare", - + target: "webworker", + noExternal: true, message: "created Cloudflare Pages build .cloudflare/\n\ninstall wrangler and run `wrangler pages dev .cloudflare` to preview your build\nhttps://github.com/cloudflare/workers-sdk/tree/main/packages/wrangler#installation\nhttps://developers.cloudflare.com/workers/wrangler/commands/#pages", @@ -52,8 +53,6 @@ export const adapter: AdapterBuilder = async () => { }; }, - ssrTarget: "webworker", - run: async () => { const outDir = ".cloudflare"; diff --git a/packages/domco/src/adapter/deno/index.ts b/packages/domco/src/adapter/deno/index.ts new file mode 100644 index 0000000..2bc4419 --- /dev/null +++ b/packages/domco/src/adapter/deno/index.ts @@ -0,0 +1,78 @@ +import { dirNames } from "../../constants/index.js"; +import type { AdapterBuilder } from "../../types/public/index.js"; + +/** + * Creates a Deno Deploy build. + * + * @param options adapter options + * @returns Deno domco adapter. + * + * @example + * + * ```ts + * import { domco } from "domco"; + * import { adapter } from "domco/adapter/deno"; + * import { defineConfig } from "vite"; + * + * export default defineConfig({ + * plugins: [ + * domco({ + * adapter: adapter(), + * }), + * ], + * }); + * ``` + */ +export const adapter: AdapterBuilder = async () => { + return { + name: "deno", + target: "webworker", + noExternal: true, + message: + "created Deno build dist/\n\nrun `deno run -A dist/server/main.js` to start the server.", + + entry: ({ appId }) => { + return { + id: "main", + code: ` + import { createApp } from "${appId}"; + import { serveDir } from "https://jsr.io/@std/http/1.0.6/file_server.ts"; + + const getStatic = async (req) => { + return serveDir(req, { + fsRoot: "./${dirNames.out.base}/${dirNames.out.client.base}", + quiet: true, + }); + }; + + const serveStatic = async (c, next) => { + const res = await getStatic(c.req.raw); + + if (res.ok) return res; + + if (res.status === 301) { + const location = res.headers.get("location"); + if (location) { + const redirect = await getStatic(new Request(location)); + if (redirect.ok) return redirect; + } + } + + await next(); + }; + + const app = createApp({ + middleware: [ + { + path: "/*", + handler: serveStatic, + }, + ], + }); + + Deno.serve(app.fetch); + `, + }; + }, + }; +}; diff --git a/packages/domco/src/adapter/vercel/index.ts b/packages/domco/src/adapter/vercel/index.ts index c762c40..047a917 100644 --- a/packages/domco/src/adapter/vercel/index.ts +++ b/packages/domco/src/adapter/vercel/index.ts @@ -152,15 +152,11 @@ export const adapter: AdapterBuilder = ( return { name: "vercel", - + target: isEdge ? "webworker" : "node", + noExternal: true, message: `created ${resolvedOptions.config.runtime} build .vercel/`, - entry: isEdge ? edgeEntry : nodeEntry, - - ssrTarget: isEdge ? "webworker" : "node", - devMiddleware: [imageMiddleware], - previewMiddleware: [imageMiddleware], run: async () => { diff --git a/packages/domco/src/app/dev/index.ts b/packages/domco/src/app/dev/index.ts index a99fcba..f31948c 100644 --- a/packages/domco/src/app/dev/index.ts +++ b/packages/domco/src/app/dev/index.ts @@ -1,12 +1,8 @@ import type { Routes } from "../../types/private/index.js"; import type { CreateAppOptions } from "../../types/public/index.js"; import { createRoutes } from "../../util/create-routes/index.js"; -import { - addMiddleware, - addRoutes, - addSetup, - setServer, -} from "../util/index.js"; +import { standardMiddleware } from "../mw/index.js"; +import { addMiddleware, addRoutes, addSetup } from "../util/index.js"; import { Hono } from "hono"; import fs from "node:fs/promises"; import path from "node:path"; @@ -50,10 +46,11 @@ export const createAppDev = ( stack: `No route matched for ${c.req.url}\n\nMake sure there is a route registered for this path.`, name: "404 - Not Found", }), + 404, ); }); - app.use(setServer); + addMiddleware(app, standardMiddleware); addSetup(app, routes); diff --git a/packages/domco/src/app/index.ts b/packages/domco/src/app/index.ts index 0eeff16..75d66b7 100644 --- a/packages/domco/src/app/index.ts +++ b/packages/domco/src/app/index.ts @@ -1,5 +1,6 @@ import type { CreateAppOptions } from "../types/public/index.js"; -import { addMiddleware, addRoutes, addSetup, setServer } from "./util/index.js"; +import { standardMiddleware } from "./mw/index.js"; +import { addMiddleware, addRoutes, addSetup } from "./util/index.js"; import { manifest } from "domco:manifest"; import { routes } from "domco:routes"; import { Hono } from "hono"; @@ -14,7 +15,7 @@ import { Hono } from "hono"; * Below is an example of how to import your app after build is complete to make a * Node server. You can adapt this to different [environments of your choice](https://hono.dev/docs/getting-started/basic). * - * @param options createApp options + * @param options * @returns Hono app instance. * * @example @@ -37,12 +38,11 @@ export const createApp = ( ) => { const app = new Hono(options.honoOptions); - app.use(setServer); + addMiddleware(app, options.middleware); + addMiddleware(app, standardMiddleware); addSetup(app, routes); - addMiddleware(app, options.middleware); - addRoutes({ app, routes, manifest }); return app; diff --git a/packages/domco/src/app/mw/index.ts b/packages/domco/src/app/mw/index.ts new file mode 100644 index 0000000..fc56ba4 --- /dev/null +++ b/packages/domco/src/app/mw/index.ts @@ -0,0 +1,24 @@ +import { dirNames, headers } from "../../constants/index.js"; +import type { CreateAppOptions } from "../../types/public/index.js"; +import { setServer } from "../util/index.js"; +import { trimTrailingSlash } from "hono/trailing-slash"; + +/** Middleware used in `dev` and `prod`. */ +export const standardMiddleware: CreateAppOptions["middleware"] = [ + { + // this can be applied in `dev` because static files are served directly from `src/` + path: `/${dirNames.out.client.immutable}/*`, + handler: async (c, next) => { + await next(); + c.header("Cache-Control", headers.cacheControl.immutable); + }, + }, + { + path: "/*", + handler: setServer, + }, + { + path: "/*", + handler: trimTrailingSlash(), + }, +]; diff --git a/packages/domco/src/app/util/index.ts b/packages/domco/src/app/util/index.ts index e03331f..5b0b2c2 100644 --- a/packages/domco/src/app/util/index.ts +++ b/packages/domco/src/app/util/index.ts @@ -163,7 +163,7 @@ export const addSetup = (app: Hono, routes: Routes) => { } }; -export const setServer = createMiddleware(async (appC, next) => { +export const setServer = createMiddleware((appC, next) => { const server: Server = (routePath: string, init?: RequestInit) => { const req = new Request(new URL(appC.req.url).origin + routePath, init); return fetch(req); diff --git a/packages/domco/src/plugin/config/index.ts b/packages/domco/src/plugin/config/index.ts index f3b2850..4c36083 100644 --- a/packages/domco/src/plugin/config/index.ts +++ b/packages/domco/src/plugin/config/index.ts @@ -5,7 +5,7 @@ import { ssrId } from "../adapter/index.js"; import { appId } from "../entry/index.js"; import path from "node:path"; import process from "node:process"; -import type { Plugin } from "vite"; +import type { Plugin, SSROptions } from "vite"; export const configPlugin = async ( domcoConfig: DomcoConfig, @@ -33,8 +33,8 @@ export const configPlugin = async ( : path.join(process.cwd(), dirNames.public), appType: "custom", ssr: { - target: adapter?.ssrTarget, - noExternal: build ? true : ["domco"], + target: adapter?.target, + noExternal: getNoExternal({ build, adapter }), }, logLevel: build ? "warn" : "info", build: { @@ -68,6 +68,24 @@ export const configPlugin = async ( }; }; +const getNoExternal = (options: { adapter?: Adapter; build: boolean }) => { + const { adapter, build } = options; + + let noExternal: SSROptions["noExternal"] = ["domco"]; + + if (!build) return noExternal; + + if (adapter?.noExternal === true) { + noExternal = true; + } else if (adapter?.noExternal instanceof Array) { + noExternal.push(...adapter.noExternal); + } else if (adapter?.noExternal) { + noExternal.push(adapter.noExternal); + } + + return noExternal; +}; + const serverEntry = (adapter?: Adapter) => { const entry: Record = { app: appId, diff --git a/packages/domco/src/types/public/index.ts b/packages/domco/src/types/public/index.ts index 9c2730f..463ce86 100644 --- a/packages/domco/src/types/public/index.ts +++ b/packages/domco/src/types/public/index.ts @@ -2,7 +2,7 @@ import type { MaybePromise } from "../helper/index.js"; import type { Env, MiddlewareHandler } from "hono"; import type { HonoOptions } from "hono/hono-base"; import type { HtmlEscapedString } from "hono/utils/html"; -import type { SSRTarget, ViteDevServer } from "vite"; +import type { SSRTarget, ViteDevServer, SSROptions } from "vite"; export type CreateAppMiddleware = { /** Path to apply the middleware to. */ @@ -45,25 +45,20 @@ export type Adapter = { /** The name of the adapter. */ name: string; - /** - * The script to run after Vite build is complete. - */ + /** The script to run after Vite build is complete. */ run?: () => any; - /** - * Message to log when the build is complete. - */ + /** Message to log when the build is complete. */ message: string; - /** - * Entry point for the server application. - */ + /** Entry point for the server application. */ entry: AdapterEntry; - /** - * Target for SSR build. - */ - ssrTarget: SSRTarget; + /** Passed into Vite `config.ssr.target`. */ + target?: SSRTarget; + + /** Passed into Vite `config.ssr.noExternal`. */ + noExternal?: SSROptions["noExternal"]; /** * Middleware to apply in `dev` mode. @@ -80,7 +75,7 @@ export type Adapter = { previewMiddleware?: CreateAppOptions["middleware"]; }; -export type AdapterBuilder = ( +export type AdapterBuilder = ( AdapterOptions?: AdapterOptions, ) => MaybePromise; diff --git a/packages/domco/src/util/create-routes/index.ts b/packages/domco/src/util/create-routes/index.ts index fce4910..db0f4f5 100644 --- a/packages/domco/src/util/create-routes/index.ts +++ b/packages/domco/src/util/create-routes/index.ts @@ -19,7 +19,7 @@ export const createRoutes = async () => { checkEndings: toAllScriptEndings(fileNames.server), }); - // add init + // add setup for (const fileName of toAllScriptEndings(fileNames.setup)) { const filePath = path.join(process.cwd(), dirNames.src, fileName); if (await fileExists(filePath)) { diff --git a/packages/domco/src/version/index.ts b/packages/domco/src/version/index.ts index 31d5aed..2cf4c1e 100644 --- a/packages/domco/src/version/index.ts +++ b/packages/domco/src/version/index.ts @@ -1 +1 @@ -export const version = "0.10.0"; +export const version = "0.11.0";