Skip to content

Commit

g1t.page builds know the framework a project is built with, from its package's dependencies and config files: Vite (and React, Vue, Svelte, Solid or Preact on it), Astro, Next.js with `output: 'export'`, SvelteKit with the static adapter, Nuxt by `nuxi generate`, React Router and Remix in SPA mode, Gatsby, Docusaurus, Eleventy, Angular, Create React App, Hugo, Jekyll and mdBook are each built with their own command and served from the folder they write, read from their config where it moves it. A Cloudflare adapter's Worker deploys as a Workers project with no Wrangler config of the project's own: Astro's, which now writes its config for wrangler in `.wrangler/deploy/config.json` (as `@cloudflare/vite-plugin` does, and that is read too), SvelteKit's `.svelte-kit/cloudflare/_worker.js`, and OpenNext's with a `wrangler.jsonc`; a site's `_worker.js`, `_routes.json` and what `.assetsignore` lists are never uploaded, and a written config's empty binding lists are no longer warned about. A framework set up to need a server (Next.js without a static export, Astro's server output, SvelteKit's auto or node adapter, a server-rendered React Router or Remix app) fails before anything is installed, saying what to change, in place of "found nothing to serve". The project's Build command and Output directory still win. The build's log names the framework, the finish report carries it as `framework` (which the deployments service ignores for now), and `g1t-runner detect` and the `g1t/detect` action output it. What deploys has a table of every framework, and the detect action's README lists them.

Claude-Session:
https://claude.ai/code/session_01PnwTRSNaC7vEHTAuBzjhrn
Claudeagent and Claudeagentcommitted Parent7d7bef0Browse files
2 files+39−60/2 viewed
+34−4
1111 uses: g1t/detect@v1
1212 - if: steps.detect.outputs.kind == 'none'
1313 run: echo "::error::Nothing here would be served."
14+ - if: steps.detect.outputs.framework == 'hugo'
15+ run: echo "A Hugo site, served from ${{ steps.detect.outputs.output-dir }}"
1416 - if: steps.detect.outputs.install != ''
1517 run: ${{ steps.detect.outputs.install }}
1618 ```
2729
2830 | Output | |
2931 | --- | --- |
30−| `kind` | `workers` (a `wrangler.jsonc`, `wrangler.json` or `wrangler.toml`), `static` (a site a build writes), `html` (the files as they are) or `none`. |
31−| `install` | How dependencies are installed, from the lockfile: `npm ci`, `pnpm install --frozen-lockfile`, and so on. Empty without a `package.json`. |
32−| `build` | What builds it: your command, `npm run build` for a package with a build script, or `wrangler deploy --dry-run` for Workers. Empty when nothing does. |
33−| `output-dir` | The folder served, relative to the project (`.` for the project itself): a Workers project's assets directory, or the first of `dist`, `build`, `out`, `public`, `_site`, `.output/public` that exists. Empty when a build has yet to write it. |
32+| `kind` | `workers` (a `wrangler.jsonc`, `wrangler.json` or `wrangler.toml`, or a framework's Cloudflare adapter), `static` (a site a build writes), `html` (the files as they are) or `none` (nothing to serve, or a framework set up to need a server). |
33+| `framework` | The framework it is built with, from the table below. Empty when there is none. |
34+| `install` | How dependencies are installed, from the lockfile: `npm ci`, `pnpm install --frozen-lockfile`, and so on, and `bundle install` for Jekyll. Empty when there is nothing to install. |
35+| `build` | What builds it: your command, the package's `build` script (`npm run build`), the framework's own command, or `wrangler deploy --dry-run` for Workers. Empty when nothing does. |
36+| `output-dir` | The folder served, relative to the project (`.` for the project itself): yours, a Workers project's assets directory, the folder the framework writes, or the first of `dist`, `build`, `out`, `public`, `_site`, `.output/public` that exists. Empty when a build has yet to write it, as for a Cloudflare adapter's Worker. |
37+
38+When `kind` is `none` because of how a framework is set up, such as a
39+Next.js app without `output: 'export'`, the step's log says what to
40+change.
41+
42+## Frameworks
43+
44+| `framework` | Found by | Serves |
45+| --- | --- | --- |
46+| `vite`, `vite-react`, `vite-vue`, `vite-svelte`, `vite-solid`, `vite-preact` | `vite`, and the framework's Vite plugin | `dist`, or `build.outDir` |
47+| `astro` | `astro` | `dist`, or `outDir`; a Worker with `@astrojs/cloudflare` |
48+| `nextjs` | `next` | `out` with `output: 'export'`; a Worker with `@opennextjs/cloudflare` and a `wrangler.jsonc` |
49+| `sveltekit` | `@sveltejs/kit` | `build` with `adapter-static`; a Worker with `adapter-cloudflare` |
50+| `nuxt` | `nuxt` | `.output/public`, from `nuxi generate` |
51+| `react-router`, `remix` | `@react-router/dev`, `@remix-run/dev` | `build/client` with `ssr: false` |
52+| `gatsby` | `gatsby` | `public` |
53+| `docusaurus` | `@docusaurus/core` | `build` |
54+| `eleventy` | `@11ty/eleventy` | `_site` |
55+| `angular` | `@angular/core` and `angular.json` | `dist/<project>/browser` |
56+| `create-react-app` | `react-scripts` | `build` |
57+| `hugo` | `hugo.toml`, or Hugo's `config.toml` | `public` |
58+| `jekyll` | `_config.yml` and a `Gemfile` | `_site` |
59+| `mdbook` | `book.toml` | `book` |
60+
61+[What deploys](https://docs.g1t.sh/guides/deployments/#frameworks) has
62+each one's build command. Your `build-command` and `output-dir` win over
63+what is detected.
3464
3565 It runs `g1t-runner detect`, found or downloaded as `g1t/deploy` finds it.
+5−2
11 name: Detect a g1t.page project
2−description: Says what a g1t.page build of this checkout would find, without building anything. Its kind, how it installs, what builds it and where its output is.
2+description: Says what a g1t.page build of this checkout would find, without building anything. Its kind and framework, how it installs, what builds it and where its output is.
33 author: g1t
44
55 inputs:
1818
1919 outputs:
2020 kind:
21− description: workers (a Wrangler config), static (a site a build writes), html (the files as they are) or none.
21+ description: workers (a Wrangler config, or a framework's Cloudflare adapter), static (a site a build writes), html (the files as they are) or none (nothing to serve, or a framework set up to need a server).
2222 value: ${{ steps.detect.outputs.kind }}
2323 install:
2424 description: How its dependencies are installed, such as npm ci. Empty without a package.json.
2929 output-dir:
3030 description: The folder that is served, relative to the project (. for the project itself). Empty when a build has yet to write it.
3131 value: ${{ steps.detect.outputs.output-dir }}
32+ framework:
33+ description: The framework it is built with, such as vite, astro, nextjs, sveltekit or hugo. Empty when there is none.
34+ value: ${{ steps.detect.outputs.framework }}
3235
3336 runs:
3437 using: composite