diff --git a/.github/utils/update-version.cjs b/.github/utils/update-version.cjs new file mode 100644 index 00000000..677ebce6 --- /dev/null +++ b/.github/utils/update-version.cjs @@ -0,0 +1,36 @@ +/** + * Update the package.json version property for the given package + * to a pre-release version based off the current SHA. + * + * Usage: + * + * ``` + * node ./.github/utils/version-script.js + * ``` + */ + +const { readFileSync, writeFileSync } = require("node:fs"); +const { execSync } = require("node:child_process"); +const assert = require("node:assert"); + +try { + const packagePath = getArgs()[0]; + assert(packagePath, "Required package path missing."); + const packageJsonPath = `${packagePath}/package.json`; + const pkg = JSON.parse(readFileSync(packageJsonPath)); + const stdout = execSync("git rev-parse --short HEAD", { encoding: "utf8" }); + pkg.version = "0.0.0-" + stdout.trim(); + writeFileSync(packageJsonPath, JSON.stringify(pkg, null, "\t") + "\n"); +} catch (error) { + console.error(error); + process.exit(1); +} + +/** + * Get the command line args, stripping `node` and script filename, etc. + */ +function getArgs() { + const args = Array.from(process.argv); + while (args.shift() !== module.filename) {} + return args; +} diff --git a/.github/workflows/prereleases.yml b/.github/workflows/prereleases.yml new file mode 100644 index 00000000..3b288bc9 --- /dev/null +++ b/.github/workflows/prereleases.yml @@ -0,0 +1,44 @@ +name: Publish prereleases +on: + push: + branches: + - main + +jobs: + release: + if: ${{ github.repository_owner == 'flarelabs-net' }} + name: Publish builder package + runs-on: ubuntu-latest + + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 9.10.0 + + - name: Install Node.js 20 + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "pnpm" + registry-url: "https://registry.npmjs.org" + + - name: Install Dependencies + uses: pnpm i --frozen-lockfile + + - name: Build + run: pnpm -F builder run build + + - name: Update package.json version + run: node .github/utils/version-script.cjs builder + + - name: Publish to NPM + run: pnpm publish -F cloudflare --no-git-checks + env: + NODE_ENV: "production" + NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} diff --git a/builder/README.md b/builder/README.md index a2a2c8f9..423e7c8e 100644 --- a/builder/README.md +++ b/builder/README.md @@ -1,18 +1,21 @@ # Next.js builder for Cloudflare -## Build your app +## Configure your app - add the following `devDependency` to the `package.json`: - ```json - "node-url": "npm:url@^0.11.4", - "wrangler": "^3.77.0" + ```bash + pnpm add -D wrangler@latest @opennextjs/cloudflare ``` -- Execute `npx @flarelabs-net/builder@latest` in your app folder - ## Serve your app +- build the app and adapt it for Cloudflare + + ```bash + pnpx cloudflare + ``` + - add a `wrangler.toml` at the root of your project ```toml @@ -22,11 +25,13 @@ compatibility_date = "2024-08-29" compatibility_flags = ["nodejs_compat_v2"] - workers_dev = true - minify = false # Use the new Workers + Assets to host the static frontend files experimental_assets = { directory = ".worker-next/assets", binding = "ASSETS" } ``` -- Use `wrangler dev` +- Preview the app in Wrangler + + ```bash + pnpm wrangler dev + ``` diff --git a/builder/package.json b/builder/package.json index 42c7bf40..b507f539 100644 --- a/builder/package.json +++ b/builder/package.json @@ -1,5 +1,5 @@ { - "name": "@flarelabs-net/builder", + "name": "@opennextjs/cloudflare", "description": "Cloudflare builder for next apps", "version": "0.0.1", "scripts": { diff --git a/examples/api/package.json b/examples/api/package.json index 4fd7c7e1..dd63f6cd 100644 --- a/examples/api/package.json +++ b/examples/api/package.json @@ -7,7 +7,7 @@ "build": "next build", "start": "next start", "lint": "next lint", - "build:worker": "pnpm builder", + "build:worker": "pnpm cloudflare", "dev:worker": "wrangler dev --port 8770", "preview:worker": "pnpm build:worker && pnpm dev:worker", "e2e": "playwright test" @@ -18,7 +18,7 @@ "react-dom": "catalog:" }, "devDependencies": { - "@flarelabs-net/builder": "workspace:*", + "@opennextjs/cloudflare": "workspace:*", "@playwright/test": "catalog:", "@types/node": "catalog:", "wrangler": "catalog:" diff --git a/examples/create-next-app/package.json b/examples/create-next-app/package.json index fde85c8f..4455553d 100644 --- a/examples/create-next-app/package.json +++ b/examples/create-next-app/package.json @@ -7,7 +7,7 @@ "build": "next build", "start": "next start", "lint": "next lint", - "build:worker": "pnpm builder", + "build:worker": "pnpm cloudflare", "dev:worker": "wrangler dev --port 8771", "preview:worker": "pnpm build:worker && pnpm dev:worker", "e2e": "playwright test -c e2e/playwright.config.ts" @@ -18,7 +18,7 @@ "next": "catalog:" }, "devDependencies": { - "@flarelabs-net/builder": "workspace:*", + "@opennextjs/cloudflare": "workspace:*", "@playwright/test": "catalog:", "@types/node": "catalog:", "@types/react": "catalog:", diff --git a/package.json b/package.json index a07e0b81..d483dbd6 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "scripts": { "prettier:check": "prettier --check .", "prettier:fix": "prettier --write .", - "postinstall": "pnpm --filter builder build", + "postinstall": "pnpm --filter cloudflare build", "install-playwright": "playwright install --with-deps", "e2e": "pnpm -r e2e" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 835e79a7..47306c42 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -103,7 +103,7 @@ importers: specifier: 'catalog:' version: 18.3.1(react@18.3.1) devDependencies: - '@flarelabs-net/builder': + '@opennextjs/cloudflare': specifier: workspace:* version: link:../../builder '@playwright/test': @@ -128,7 +128,7 @@ importers: specifier: 'catalog:' version: 18.3.1(react@18.3.1) devDependencies: - '@flarelabs-net/builder': + '@opennextjs/cloudflare': specifier: workspace:* version: link:../../builder '@playwright/test': @@ -1694,10 +1694,6 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.15.0: - resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} - engines: {node: '>= 0.4'} - is-core-module@2.15.1: resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} @@ -2039,8 +2035,8 @@ packages: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} - ohash@1.1.3: - resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} + ohash@1.1.4: + resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -3885,8 +3881,8 @@ snapshots: '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0) - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.0) eslint-plugin-react: 7.36.1(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) @@ -3905,37 +3901,37 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.6 enhanced-resolve: 5.17.1 eslint: 8.57.0 - eslint-module-utils: 2.11.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.11.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.8.0 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.11.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.11.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0): + eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -3946,7 +3942,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.11.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.11.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -4339,10 +4335,6 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.15.0: - dependencies: - hasown: 2.0.2 - is-core-module@2.15.1: dependencies: hasown: 2.0.2 @@ -4674,7 +4666,7 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 - ohash@1.1.3: {} + ohash@1.1.4: {} once@1.4.0: dependencies: @@ -4870,7 +4862,7 @@ snapshots: resolve@1.22.8: dependencies: - is-core-module: 2.15.0 + is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -5281,7 +5273,7 @@ snapshots: unenv-nightly@2.0.0-1726478054.1e87097: dependencies: defu: 6.1.4 - ohash: 1.1.3 + ohash: 1.1.4 pathe: 1.1.2 ufo: 1.5.4