@webflow/cloud-app 0.1.0-beta.10
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/LICENSE +21 -0
- package/README.md +161 -0
- package/dist/bindings.d.ts +190 -0
- package/dist/bindings.d.ts.map +1 -0
- package/dist/bindings.js +126 -0
- package/dist/bindings.js.map +1 -0
- package/dist/compat-date.d.ts +68 -0
- package/dist/compat-date.d.ts.map +1 -0
- package/dist/compat-date.js +169 -0
- package/dist/compat-date.js.map +1 -0
- package/dist/config/package-json.d.ts +57 -0
- package/dist/config/package-json.d.ts.map +1 -0
- package/dist/config/package-json.js +94 -0
- package/dist/config/package-json.js.map +1 -0
- package/dist/config/webflow-json.d.ts +47 -0
- package/dist/config/webflow-json.d.ts.map +1 -0
- package/dist/config/webflow-json.js +72 -0
- package/dist/config/webflow-json.js.map +1 -0
- package/dist/create-webflow-json.d.ts +21 -0
- package/dist/create-webflow-json.d.ts.map +1 -0
- package/dist/create-webflow-json.js +168 -0
- package/dist/create-webflow-json.js.map +1 -0
- package/dist/diagnostics.d.ts +23 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +31 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/errors.d.ts +13 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +23 -0
- package/dist/errors.js.map +1 -0
- package/dist/frameworks/astro/adapter-patches/assert-adapter-nested-under-mount.d.ts +28 -0
- package/dist/frameworks/astro/adapter-patches/assert-adapter-nested-under-mount.d.ts.map +1 -0
- package/dist/frameworks/astro/adapter-patches/assert-adapter-nested-under-mount.js +148 -0
- package/dist/frameworks/astro/adapter-patches/assert-adapter-nested-under-mount.js.map +1 -0
- package/dist/frameworks/astro/adapter-patches/ensure-compatible-cloudflare-adapter.d.ts +34 -0
- package/dist/frameworks/astro/adapter-patches/ensure-compatible-cloudflare-adapter.d.ts.map +1 -0
- package/dist/frameworks/astro/adapter-patches/ensure-compatible-cloudflare-adapter.js +89 -0
- package/dist/frameworks/astro/adapter-patches/ensure-compatible-cloudflare-adapter.js.map +1 -0
- package/dist/frameworks/astro/adapter-patches/resolve-cloudflare-adapter.d.ts +39 -0
- package/dist/frameworks/astro/adapter-patches/resolve-cloudflare-adapter.d.ts.map +1 -0
- package/dist/frameworks/astro/adapter-patches/resolve-cloudflare-adapter.js +93 -0
- package/dist/frameworks/astro/adapter-patches/resolve-cloudflare-adapter.js.map +1 -0
- package/dist/frameworks/astro/astro5.d.ts +28 -0
- package/dist/frameworks/astro/astro5.d.ts.map +1 -0
- package/dist/frameworks/astro/astro5.js +276 -0
- package/dist/frameworks/astro/astro5.js.map +1 -0
- package/dist/frameworks/astro/astro6.d.ts +28 -0
- package/dist/frameworks/astro/astro6.d.ts.map +1 -0
- package/dist/frameworks/astro/astro6.js +305 -0
- package/dist/frameworks/astro/astro6.js.map +1 -0
- package/dist/frameworks/astro/astro7.d.ts +28 -0
- package/dist/frameworks/astro/astro7.d.ts.map +1 -0
- package/dist/frameworks/astro/astro7.js +303 -0
- package/dist/frameworks/astro/astro7.js.map +1 -0
- package/dist/frameworks/astro/index.d.ts +10 -0
- package/dist/frameworks/astro/index.d.ts.map +1 -0
- package/dist/frameworks/astro/index.js +16 -0
- package/dist/frameworks/astro/index.js.map +1 -0
- package/dist/frameworks/astro/session-check.d.ts +24 -0
- package/dist/frameworks/astro/session-check.d.ts.map +1 -0
- package/dist/frameworks/astro/session-check.js +166 -0
- package/dist/frameworks/astro/session-check.js.map +1 -0
- package/dist/frameworks/astro/templates/astro.config.webflow.ts +61 -0
- package/dist/frameworks/astro/templates/v5/astro.config.mjs.template +25 -0
- package/dist/frameworks/astro/templates/v5/webflow-loader.ts +126 -0
- package/dist/frameworks/astro/templates/v5/wrangler.json +6 -0
- package/dist/frameworks/astro/templates/v6/astro.config.mjs.template +35 -0
- package/dist/frameworks/astro/templates/v6/webflow-loader.ts +126 -0
- package/dist/frameworks/astro/templates/v6/wrangler.json +9 -0
- package/dist/frameworks/astro/templates/v7/astro.config.mjs.template +34 -0
- package/dist/frameworks/astro/templates/v7/webflow-loader.ts +125 -0
- package/dist/frameworks/astro/templates/v7/wrangler.json +9 -0
- package/dist/frameworks/astro/templates/webflow-image-url.ts +140 -0
- package/dist/frameworks/base.d.ts +134 -0
- package/dist/frameworks/base.d.ts.map +1 -0
- package/dist/frameworks/base.js +175 -0
- package/dist/frameworks/base.js.map +1 -0
- package/dist/frameworks/errors.d.ts +72 -0
- package/dist/frameworks/errors.d.ts.map +1 -0
- package/dist/frameworks/errors.js +120 -0
- package/dist/frameworks/errors.js.map +1 -0
- package/dist/frameworks/nextjs/adapter-resolver.d.ts +72 -0
- package/dist/frameworks/nextjs/adapter-resolver.d.ts.map +1 -0
- package/dist/frameworks/nextjs/adapter-resolver.js +246 -0
- package/dist/frameworks/nextjs/adapter-resolver.js.map +1 -0
- package/dist/frameworks/nextjs/index.d.ts +38 -0
- package/dist/frameworks/nextjs/index.d.ts.map +1 -0
- package/dist/frameworks/nextjs/index.js +268 -0
- package/dist/frameworks/nextjs/index.js.map +1 -0
- package/dist/frameworks/nextjs/templates/next.config.ts.template +13 -0
- package/dist/frameworks/nextjs/templates/next.config.webflow.ts +46 -0
- package/dist/frameworks/nextjs/templates/open-next.config.ts +3 -0
- package/dist/frameworks/nextjs/templates/webflow-loader.ts +44 -0
- package/dist/frameworks/nextjs/templates/wrangler.json +6 -0
- package/dist/frameworks/registry.d.ts +127 -0
- package/dist/frameworks/registry.d.ts.map +1 -0
- package/dist/frameworks/registry.js +257 -0
- package/dist/frameworks/registry.js.map +1 -0
- package/dist/frameworks/static/index.d.ts +116 -0
- package/dist/frameworks/static/index.d.ts.map +1 -0
- package/dist/frameworks/static/index.js +394 -0
- package/dist/frameworks/static/index.js.map +1 -0
- package/dist/frameworks/static/templates/wrangler.json +8 -0
- package/dist/frameworks/types.d.ts +138 -0
- package/dist/frameworks/types.d.ts.map +1 -0
- package/dist/frameworks/types.js +3 -0
- package/dist/frameworks/types.js.map +1 -0
- package/dist/frameworks/vite/index.d.ts +46 -0
- package/dist/frameworks/vite/index.d.ts.map +1 -0
- package/dist/frameworks/vite/index.js +303 -0
- package/dist/frameworks/vite/index.js.map +1 -0
- package/dist/frameworks/vite/templates/vite.config.ts.template +14 -0
- package/dist/frameworks/vite/templates/vite.config.webflow.ts +52 -0
- package/dist/frameworks/vite/templates/wrangler.json +10 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +136 -0
- package/dist/index.js.map +1 -0
- package/dist/pipeline.d.ts +12 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +293 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/ports/command-runner.d.ts +59 -0
- package/dist/ports/command-runner.d.ts.map +1 -0
- package/dist/ports/command-runner.js +126 -0
- package/dist/ports/command-runner.js.map +1 -0
- package/dist/ports/filesystem.d.ts +19 -0
- package/dist/ports/filesystem.d.ts.map +1 -0
- package/dist/ports/filesystem.js +68 -0
- package/dist/ports/filesystem.js.map +1 -0
- package/dist/ports/index.d.ts +17 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +14 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/ports/logger.d.ts +22 -0
- package/dist/ports/logger.d.ts.map +1 -0
- package/dist/ports/logger.js +18 -0
- package/dist/ports/logger.js.map +1 -0
- package/dist/ports/telemetry.d.ts +23 -0
- package/dist/ports/telemetry.d.ts.map +1 -0
- package/dist/ports/telemetry.js +12 -0
- package/dist/ports/telemetry.js.map +1 -0
- package/dist/static-base-href.d.ts +31 -0
- package/dist/static-base-href.d.ts.map +1 -0
- package/dist/static-base-href.js +183 -0
- package/dist/static-base-href.js.map +1 -0
- package/dist/toolchain/errors.d.ts +32 -0
- package/dist/toolchain/errors.d.ts.map +1 -0
- package/dist/toolchain/errors.js +31 -0
- package/dist/toolchain/errors.js.map +1 -0
- package/dist/toolchain/resolver.d.ts +25 -0
- package/dist/toolchain/resolver.d.ts.map +1 -0
- package/dist/toolchain/resolver.js +200 -0
- package/dist/toolchain/resolver.js.map +1 -0
- package/dist/toolchain/types.d.ts +52 -0
- package/dist/toolchain/types.d.ts.map +1 -0
- package/dist/toolchain/types.js +10 -0
- package/dist/toolchain/types.js.map +1 -0
- package/dist/types.d.ts +71 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/fs.d.ts +29 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +126 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/index.d.ts +11 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +27 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/node-version.d.ts +20 -0
- package/dist/utils/node-version.d.ts.map +1 -0
- package/dist/utils/node-version.js +113 -0
- package/dist/utils/node-version.js.map +1 -0
- package/dist/utils/process.d.ts +25 -0
- package/dist/utils/process.d.ts.map +1 -0
- package/dist/utils/process.js +40 -0
- package/dist/utils/process.js.map +1 -0
- package/dist/utils/reserved-env.d.ts +26 -0
- package/dist/utils/reserved-env.d.ts.map +1 -0
- package/dist/utils/reserved-env.js +51 -0
- package/dist/utils/reserved-env.js.map +1 -0
- package/dist/utils/template.d.ts +15 -0
- package/dist/utils/template.d.ts.map +1 -0
- package/dist/utils/template.js +75 -0
- package/dist/utils/template.js.map +1 -0
- package/dist/utils/version.d.ts +9 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +52 -0
- package/dist/utils/version.js.map +1 -0
- package/dist/wrangler.d.ts +195 -0
- package/dist/wrangler.d.ts.map +1 -0
- package/dist/wrangler.js +372 -0
- package/dist/wrangler.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cloudflare adapter version resolution for Next.js.
|
|
4
|
+
*
|
|
5
|
+
* `@opennextjs/cloudflare` declares a `next` peer dependency whose range moves
|
|
6
|
+
* with each release and sometimes carves out "dead zones" — Next.js versions
|
|
7
|
+
* that are newer than an old floor but excluded by a tighter upper bound (e.g.
|
|
8
|
+
* peer `>=15.5.18 <16 || >=16.2.6` excludes next@16.0.0–16.2.5). Installing the
|
|
9
|
+
* adapter with no version constraint always pulls the latest, so an app pinned
|
|
10
|
+
* inside a dead zone fails with a cryptic npm `ERESOLVE` before the build even
|
|
11
|
+
* starts.
|
|
12
|
+
*
|
|
13
|
+
* This module resolves the concrete Next.js version the app will install and
|
|
14
|
+
* picks the highest published adapter release whose peer range accepts it,
|
|
15
|
+
* pinning that version explicitly. When the version cannot be determined it
|
|
16
|
+
* signals a fallback to the previous "install latest" behaviour; when no
|
|
17
|
+
* release is compatible it raises an actionable error instead of letting npm
|
|
18
|
+
* fail opaquely.
|
|
19
|
+
*
|
|
20
|
+
* All metadata is read through the app's own npm configuration (`npm view` run
|
|
21
|
+
* in the app directory), so adapter selection and the subsequent install
|
|
22
|
+
* resolve against the same registry, scoped registry, and auth.
|
|
23
|
+
*/
|
|
24
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
27
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
28
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
29
|
+
}
|
|
30
|
+
Object.defineProperty(o, k2, desc);
|
|
31
|
+
}) : (function(o, m, k, k2) {
|
|
32
|
+
if (k2 === undefined) k2 = k;
|
|
33
|
+
o[k2] = m[k];
|
|
34
|
+
}));
|
|
35
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
36
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
37
|
+
}) : function(o, v) {
|
|
38
|
+
o["default"] = v;
|
|
39
|
+
});
|
|
40
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
41
|
+
var ownKeys = function(o) {
|
|
42
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
43
|
+
var ar = [];
|
|
44
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
45
|
+
return ar;
|
|
46
|
+
};
|
|
47
|
+
return ownKeys(o);
|
|
48
|
+
};
|
|
49
|
+
return function (mod) {
|
|
50
|
+
if (mod && mod.__esModule) return mod;
|
|
51
|
+
var result = {};
|
|
52
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
53
|
+
__setModuleDefault(result, mod);
|
|
54
|
+
return result;
|
|
55
|
+
};
|
|
56
|
+
})();
|
|
57
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
58
|
+
exports.defaultAdapterResolverIO = void 0;
|
|
59
|
+
exports.selectAdapterVersion = selectAdapterVersion;
|
|
60
|
+
exports.resolveCompatibleAdapterVersion = resolveCompatibleAdapterVersion;
|
|
61
|
+
const node_child_process_1 = require("node:child_process");
|
|
62
|
+
const node_util_1 = require("node:util");
|
|
63
|
+
const semver = __importStar(require("semver"));
|
|
64
|
+
const errors_1 = require("../errors");
|
|
65
|
+
const execFileAsync = (0, node_util_1.promisify)(node_child_process_1.execFile);
|
|
66
|
+
/**
|
|
67
|
+
* Generous stdout cap for `npm view`: the adapter's full metadata (one manifest
|
|
68
|
+
* per published version) is a few MB and grows as releases accumulate.
|
|
69
|
+
*/
|
|
70
|
+
const NPM_MAX_BUFFER = 32 * 1024 * 1024;
|
|
71
|
+
/** The framework package the adapter declares as a peer dependency. */
|
|
72
|
+
const NEXT_PACKAGE = 'next';
|
|
73
|
+
/**
|
|
74
|
+
* Pick the highest stable adapter version whose declared `next` peer range is
|
|
75
|
+
* satisfied by `installedNext`.
|
|
76
|
+
*
|
|
77
|
+
* Versions that declare no `next` peer dependency are ignored: they predate the
|
|
78
|
+
* adapter pinning Next.js and silently installing one would mask a real
|
|
79
|
+
* incompatibility. Prerelease adapter versions are ignored too. Returns null
|
|
80
|
+
* when nothing matches.
|
|
81
|
+
*/
|
|
82
|
+
function selectAdapterVersion(installedNext, candidates) {
|
|
83
|
+
const compatible = candidates
|
|
84
|
+
.filter((c) => c.nextPeerRange !== undefined)
|
|
85
|
+
.filter((c) => semver.valid(c.version) !== null && semver.prerelease(c.version) === null)
|
|
86
|
+
.filter((c) => semver.satisfies(installedNext, c.nextPeerRange, { includePrerelease: false }))
|
|
87
|
+
.map((c) => c.version);
|
|
88
|
+
if (compatible.length === 0) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
return compatible.sort(semver.rcompare)[0];
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Resolve the adapter version to install for a project pinned to `nextSpec`,
|
|
95
|
+
* reading all metadata through the app's npm config at `cwd`.
|
|
96
|
+
*
|
|
97
|
+
* - Returns a concrete version string to pin when a compatible release exists.
|
|
98
|
+
* - Returns null when the Next.js version can't be determined or the metadata
|
|
99
|
+
* lookup fails — the caller should fall back to installing the latest adapter
|
|
100
|
+
* (the previous behaviour), which is no worse than before.
|
|
101
|
+
* - Throws {@link FrameworkValidationError} when the Next.js version is known
|
|
102
|
+
* but no published adapter release accepts it, surfacing a clear remediation
|
|
103
|
+
* instead of a downstream npm `ERESOLVE`.
|
|
104
|
+
*/
|
|
105
|
+
async function resolveCompatibleAdapterVersion(log, adapterName, nextSpec, cwd, io = exports.defaultAdapterResolverIO) {
|
|
106
|
+
let installedNext;
|
|
107
|
+
try {
|
|
108
|
+
installedNext = await io.resolveInstalledNextVersion(nextSpec, cwd);
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
log.warn(`Could not determine the Next.js version from "${nextSpec}" (${errorMessage(err)}); ` +
|
|
112
|
+
`installing the latest ${adapterName}.`);
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
if (installedNext === null || semver.prerelease(installedNext) !== null) {
|
|
116
|
+
log.info(`Next.js version "${installedNext ?? nextSpec}" is unpinned, a prerelease, or local; ` +
|
|
117
|
+
`installing the latest ${adapterName}.`);
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
let candidates;
|
|
121
|
+
try {
|
|
122
|
+
candidates = await io.fetchAdapterCandidates(adapterName, cwd);
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
log.warn(`Could not fetch ${adapterName} versions (${errorMessage(err)}); installing the latest.`);
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
const selected = selectAdapterVersion(installedNext, candidates);
|
|
129
|
+
if (selected !== null) {
|
|
130
|
+
log.info(`Resolved ${adapterName}@${selected} as compatible with next@${installedNext}.`);
|
|
131
|
+
return selected;
|
|
132
|
+
}
|
|
133
|
+
const supported = summarizeSupportedRanges(candidates);
|
|
134
|
+
// The build's top-level handler logs only `error.message`, so the actionable
|
|
135
|
+
// guidance must live in the message itself — not just in `remediation`.
|
|
136
|
+
throw new errors_1.FrameworkValidationError(`No ${adapterName} release is compatible with the installed Next.js version (next@${installedNext}). ` +
|
|
137
|
+
`Supported Next.js ranges: ${supported}. ` +
|
|
138
|
+
`Upgrade Next.js to a version within a supported range (e.g. the latest patch of your major), ` +
|
|
139
|
+
`or add a compatible ${adapterName} version to package.json.`, {
|
|
140
|
+
remediation: `Upgrade Next.js to a version within a supported range (for example, the latest patch of your major), ` +
|
|
141
|
+
`or add a compatible "${adapterName}" version to your package.json yourself.`,
|
|
142
|
+
documentationUrl: 'https://opennext.js.org/cloudflare',
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Distinct `next` peer ranges across stable adapter releases, newest first,
|
|
147
|
+
* capped at a few entries — used to make the dead-zone error actionable.
|
|
148
|
+
*/
|
|
149
|
+
function summarizeSupportedRanges(candidates) {
|
|
150
|
+
const seen = new Set();
|
|
151
|
+
const ranges = [];
|
|
152
|
+
const stable = candidates
|
|
153
|
+
.filter((c) => c.nextPeerRange !== undefined)
|
|
154
|
+
.filter((c) => semver.valid(c.version) !== null && semver.prerelease(c.version) === null)
|
|
155
|
+
.sort((a, b) => semver.rcompare(a.version, b.version));
|
|
156
|
+
for (const c of stable) {
|
|
157
|
+
const range = c.nextPeerRange;
|
|
158
|
+
if (!seen.has(range)) {
|
|
159
|
+
seen.add(range);
|
|
160
|
+
ranges.push(range);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return ranges.slice(0, 3).join('; ') || '(none published)';
|
|
164
|
+
}
|
|
165
|
+
function errorMessage(err) {
|
|
166
|
+
return err instanceof Error ? err.message : String(err);
|
|
167
|
+
}
|
|
168
|
+
/** Run `npm view <args> --json` in `cwd` and return the parsed JSON (or null). */
|
|
169
|
+
async function npmViewJson(args, cwd) {
|
|
170
|
+
const { stdout } = await execFileAsync('npm', ['view', ...args, '--json'], {
|
|
171
|
+
cwd,
|
|
172
|
+
maxBuffer: NPM_MAX_BUFFER,
|
|
173
|
+
});
|
|
174
|
+
const trimmed = stdout.trim();
|
|
175
|
+
return trimmed === '' ? null : JSON.parse(trimmed);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Read every published adapter version and its `next` peer range via `npm view`
|
|
179
|
+
* run in the app's `cwd`, so the metadata comes from the same registry/auth
|
|
180
|
+
* surface the install uses.
|
|
181
|
+
*
|
|
182
|
+
* `npm view <pkg>@>=0.0.0 --json` returns one manifest per published version
|
|
183
|
+
* (a single object when only one matches) with a stable shape — unlike
|
|
184
|
+
* field-filtered queries, whose JSON collapses to bare values when some versions
|
|
185
|
+
* omit the field. Each element redundantly carries the full packument, so the
|
|
186
|
+
* payload is a few MB; acceptable for this one-time, adapter-absent build step.
|
|
187
|
+
*/
|
|
188
|
+
async function fetchAdapterCandidatesViaNpm(adapterName, cwd) {
|
|
189
|
+
const parsed = await npmViewJson([`${adapterName}@>=0.0.0`], cwd);
|
|
190
|
+
const manifests = Array.isArray(parsed)
|
|
191
|
+
? parsed
|
|
192
|
+
: parsed !== null
|
|
193
|
+
? [parsed]
|
|
194
|
+
: [];
|
|
195
|
+
const candidates = [];
|
|
196
|
+
for (const manifest of manifests) {
|
|
197
|
+
if (typeof manifest.version !== 'string') {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
const nextPeerRange = manifest.peerDependencies?.[NEXT_PACKAGE];
|
|
201
|
+
candidates.push({
|
|
202
|
+
version: manifest.version,
|
|
203
|
+
nextPeerRange: typeof nextPeerRange === 'string' ? nextPeerRange : undefined,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
return candidates;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Resolve the concrete Next.js version npm would install for `nextSpec`, using
|
|
210
|
+
* the app's npm config at `cwd`.
|
|
211
|
+
*
|
|
212
|
+
* Exact pins skip the network. Ranges (`^`, `~`, `>=`, …) and dist-tags
|
|
213
|
+
* (`latest`, `canary`) are resolved with `npm view`. Non-registry specs
|
|
214
|
+
* (`file:`, `link:`, `workspace:`, `git+…`) make `npm view` exit non-zero; the
|
|
215
|
+
* caller treats the rejection as "unresolvable" and falls back to installing
|
|
216
|
+
* the latest adapter.
|
|
217
|
+
*/
|
|
218
|
+
async function resolveInstalledNextVersionViaNpm(nextSpec, cwd) {
|
|
219
|
+
const spec = nextSpec.trim();
|
|
220
|
+
if (spec === '') {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
if (semver.valid(spec) !== null) {
|
|
224
|
+
return spec;
|
|
225
|
+
}
|
|
226
|
+
const parsed = await npmViewJson([`${NEXT_PACKAGE}@${spec}`, 'version'], cwd);
|
|
227
|
+
const list = Array.isArray(parsed)
|
|
228
|
+
? parsed.filter((v) => typeof v === 'string')
|
|
229
|
+
: typeof parsed === 'string'
|
|
230
|
+
? [parsed]
|
|
231
|
+
: [];
|
|
232
|
+
const valid = list.filter((v) => semver.valid(v) !== null);
|
|
233
|
+
if (valid.length === 0) {
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
// Mirror npm's default of installing the highest matching version, preferring
|
|
237
|
+
// a stable release over a prerelease when both match.
|
|
238
|
+
const stable = valid.filter((v) => semver.prerelease(v) === null);
|
|
239
|
+
return (stable.length > 0 ? stable : valid).sort(semver.rcompare)[0];
|
|
240
|
+
}
|
|
241
|
+
/** Production I/O: `npm view` run in the app's cwd. */
|
|
242
|
+
exports.defaultAdapterResolverIO = {
|
|
243
|
+
fetchAdapterCandidates: fetchAdapterCandidatesViaNpm,
|
|
244
|
+
resolveInstalledNextVersion: resolveInstalledNextVersionViaNpm,
|
|
245
|
+
};
|
|
246
|
+
//# sourceMappingURL=adapter-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-resolver.js","sourceRoot":"","sources":["../../../src/frameworks/nextjs/adapter-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { FrameworkBuilder } from '../base';
|
|
2
|
+
import type { BuildOutput, FrameworkInfo, PackageJson, WebflowJson, DetectionResult, AdapterPackage, IntegrationPackage, WebflowLoaderConfig, NodeVersionRequirement } from '../types';
|
|
3
|
+
export declare class NextJsBuilder extends FrameworkBuilder {
|
|
4
|
+
static frameworkName: string;
|
|
5
|
+
get info(): FrameworkInfo;
|
|
6
|
+
getFrameworkVersion(): string | undefined;
|
|
7
|
+
/**
|
|
8
|
+
* Detect if this is a Next.js project.
|
|
9
|
+
*/
|
|
10
|
+
static detect(packageJson: PackageJson, webflowJson?: WebflowJson): DetectionResult;
|
|
11
|
+
validate(): Promise<void>;
|
|
12
|
+
getCloudflareAdapter(): AdapterPackage;
|
|
13
|
+
getRequiredIntegrations(): IntegrationPackage[];
|
|
14
|
+
installDependencies(): Promise<void>;
|
|
15
|
+
getWebflowLoader(): WebflowLoaderConfig;
|
|
16
|
+
getUserConfigPatterns(): string[];
|
|
17
|
+
getWranglerTemplatePath(): string;
|
|
18
|
+
getAdditionalConfigFiles(): string[];
|
|
19
|
+
/** Checks if open-next.config.ts exists. */
|
|
20
|
+
private findOpenNextConfig;
|
|
21
|
+
/**
|
|
22
|
+
* Ensures open-next.config.ts exists.
|
|
23
|
+
* - If it exists: leave it alone for opennextjs-cloudflare to validate.
|
|
24
|
+
* - If missing: create it from the template.
|
|
25
|
+
*/
|
|
26
|
+
private ensureOpenNextConfig;
|
|
27
|
+
prepareConfig(): Promise<void>;
|
|
28
|
+
getBuildCommand(): string;
|
|
29
|
+
getNodeVersionRequirement(): NodeVersionRequirement | null;
|
|
30
|
+
static getOutputDeployMetadata(): BuildOutput;
|
|
31
|
+
/**
|
|
32
|
+
* Detect Next.js from built output: presence of `./worker.js` (the bundled
|
|
33
|
+
* entrypoint produced by `opennextjs-cloudflare build`). Mirrors the legacy
|
|
34
|
+
* fallback the deploy phase used to hardcode.
|
|
35
|
+
*/
|
|
36
|
+
static detectFromBuiltOutput(cwd: string): boolean;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/frameworks/nextjs/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,WAAW,EACX,WAAW,EACX,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACvB,MAAM,UAAU,CAAC;AAQlB,qBAAa,aAAc,SAAQ,gBAAgB;IACjD,OAAgB,aAAa,SAAY;IAMzC,IAAI,IAAI,IAAI,aAAa,CAOxB;IAEQ,mBAAmB,IAAI,MAAM,GAAG,SAAS;IAQlD;;OAEG;WACa,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,eAAe;IA2BtF,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB/B,oBAAoB,IAAI,cAAc;IAStC,uBAAuB,IAAI,kBAAkB,EAAE;IAKzC,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC1C,gBAAgB,IAAI,mBAAmB;IAQvC,qBAAqB,IAAI,MAAM,EAAE;IAIjC,uBAAuB,IAAI,MAAM;IAIjC,wBAAwB,IAAI,MAAM,EAAE;IAKpC,4CAA4C;IAC5C,OAAO,CAAC,kBAAkB;IAQ1B;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAwBtB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA6DpC,eAAe,IAAI,MAAM;IAIzB,yBAAyB,IAAI,sBAAsB,GAAG,IAAI;WAW1C,uBAAuB,IAAI,WAAW;IAUtD;;;;OAIG;WACa,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAG5D"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.NextJsBuilder = void 0;
|
|
37
|
+
/**
|
|
38
|
+
* Next.js Framework Builder
|
|
39
|
+
*
|
|
40
|
+
* Builds Next.js projects for Cloudflare Workers deployment using
|
|
41
|
+
* @opennextjs/cloudflare.
|
|
42
|
+
*
|
|
43
|
+
* - Requires @opennextjs/cloudflare
|
|
44
|
+
* - Build command: opennextjs-cloudflare build
|
|
45
|
+
* - Build output: .open-next/assets (static) + .open-next/worker.js (worker)
|
|
46
|
+
*/
|
|
47
|
+
const path = __importStar(require("node:path"));
|
|
48
|
+
const fs = __importStar(require("node:fs"));
|
|
49
|
+
const base_1 = require("../base");
|
|
50
|
+
const errors_1 = require("../errors");
|
|
51
|
+
const utils_1 = require("../../utils");
|
|
52
|
+
const adapter_resolver_1 = require("./adapter-resolver");
|
|
53
|
+
/** Base path for Next.js templates. */
|
|
54
|
+
const TEMPLATE_BASE = path.join(__dirname, 'templates');
|
|
55
|
+
class NextJsBuilder extends base_1.FrameworkBuilder {
|
|
56
|
+
static frameworkName = 'nextjs';
|
|
57
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
58
|
+
// FRAMEWORK INFO
|
|
59
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
60
|
+
get info() {
|
|
61
|
+
return {
|
|
62
|
+
name: 'nextjs',
|
|
63
|
+
version: '*',
|
|
64
|
+
displayName: 'Next.js',
|
|
65
|
+
packageName: 'next',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
getFrameworkVersion() {
|
|
69
|
+
return this.resolveFrameworkVersion('next');
|
|
70
|
+
}
|
|
71
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
72
|
+
// DETECTION
|
|
73
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
74
|
+
/**
|
|
75
|
+
* Detect if this is a Next.js project.
|
|
76
|
+
*/
|
|
77
|
+
static detect(packageJson, webflowJson) {
|
|
78
|
+
const specifiedFramework = webflowJson?.cloud?.framework;
|
|
79
|
+
if (specifiedFramework === 'nextjs') {
|
|
80
|
+
return { detected: true, reason: 'Specified as nextjs in webflow.json' };
|
|
81
|
+
}
|
|
82
|
+
// If webflow.json specifies a DIFFERENT framework, don't match.
|
|
83
|
+
if (specifiedFramework && specifiedFramework !== 'nextjs') {
|
|
84
|
+
return { detected: false };
|
|
85
|
+
}
|
|
86
|
+
const hasNext = packageJson.dependencies?.next !== undefined ||
|
|
87
|
+
packageJson.devDependencies?.next !== undefined;
|
|
88
|
+
if (hasNext) {
|
|
89
|
+
return { detected: true, reason: 'Found "next" in package.json' };
|
|
90
|
+
}
|
|
91
|
+
return { detected: false };
|
|
92
|
+
}
|
|
93
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
94
|
+
// VALIDATION
|
|
95
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
96
|
+
async validate() {
|
|
97
|
+
const { log, packageJson } = this.ctx;
|
|
98
|
+
const nextVersion = packageJson.dependencies?.next || packageJson.devDependencies?.next;
|
|
99
|
+
if (!nextVersion) {
|
|
100
|
+
throw new errors_1.FrameworkValidationError('Next.js is not installed in this project.', {
|
|
101
|
+
remediation: 'Install Next.js by running: npm install next',
|
|
102
|
+
documentationUrl: 'https://nextjs.org/docs/getting-started/installation',
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
log.info(`Validated Next.js project: next@${nextVersion}`);
|
|
106
|
+
}
|
|
107
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
108
|
+
// DEPENDENCIES
|
|
109
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
110
|
+
getCloudflareAdapter() {
|
|
111
|
+
return {
|
|
112
|
+
name: '@opennextjs/cloudflare',
|
|
113
|
+
// Fallback used only when a compatible version can't be resolved from the
|
|
114
|
+
// user's Next.js pin; installDependencies() normally pins an exact version.
|
|
115
|
+
version: '*',
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
getRequiredIntegrations() {
|
|
119
|
+
// No additional integrations required.
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
async installDependencies() {
|
|
123
|
+
const { log, cwd, runCommand } = this.ctx;
|
|
124
|
+
const adapter = this.getCloudflareAdapter();
|
|
125
|
+
// Respect an adapter version the user already pinned — don't second-guess it.
|
|
126
|
+
if (this.hasDependency(adapter.name)) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
log.warn(`nextjs integration requires ${adapter.name} and this project doesn't have it. installing now...`);
|
|
130
|
+
// Pin the adapter to a release whose `next` peer range accepts the user's
|
|
131
|
+
// pinned Next.js, avoiding npm ERESOLVE peer-dependency dead zones. A null
|
|
132
|
+
// result means the Next.js version couldn't be determined — fall back to the
|
|
133
|
+
// latest adapter (prior behaviour); a genuinely incompatible Next.js throws.
|
|
134
|
+
const nextSpec = this.getDependencyVersion('next') ?? '';
|
|
135
|
+
const resolvedVersion = await (0, adapter_resolver_1.resolveCompatibleAdapterVersion)(log, adapter.name, nextSpec, cwd);
|
|
136
|
+
const args = resolvedVersion === null
|
|
137
|
+
? ['install', '--save', adapter.name]
|
|
138
|
+
: ['install', '--save', '--save-exact', `${adapter.name}@${resolvedVersion}`];
|
|
139
|
+
await (0, utils_1.npm)({ log, runCommand, cwd, args });
|
|
140
|
+
}
|
|
141
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
142
|
+
// CONFIGURATION
|
|
143
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
144
|
+
getWebflowLoader() {
|
|
145
|
+
return {
|
|
146
|
+
templatePath: path.join(TEMPLATE_BASE, 'webflow-loader.ts'),
|
|
147
|
+
destinationName: 'webflow-loader.ts',
|
|
148
|
+
configPath: './webflow-loader.ts',
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
getUserConfigPatterns() {
|
|
152
|
+
return ['next.config.mjs', 'next.config.cjs', 'next.config.js', 'next.config.ts'];
|
|
153
|
+
}
|
|
154
|
+
getWranglerTemplatePath() {
|
|
155
|
+
return path.join(TEMPLATE_BASE, 'wrangler.json');
|
|
156
|
+
}
|
|
157
|
+
getAdditionalConfigFiles() {
|
|
158
|
+
const loader = this.getWebflowLoader();
|
|
159
|
+
return [loader.templatePath, path.join(TEMPLATE_BASE, 'open-next.config.ts')];
|
|
160
|
+
}
|
|
161
|
+
/** Checks if open-next.config.ts exists. */
|
|
162
|
+
findOpenNextConfig() {
|
|
163
|
+
const filename = 'open-next.config.ts';
|
|
164
|
+
if (fs.existsSync(path.join(this.cwd, filename))) {
|
|
165
|
+
return filename;
|
|
166
|
+
}
|
|
167
|
+
return undefined;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Ensures open-next.config.ts exists.
|
|
171
|
+
* - If it exists: leave it alone for opennextjs-cloudflare to validate.
|
|
172
|
+
* - If missing: create it from the template.
|
|
173
|
+
*/
|
|
174
|
+
ensureOpenNextConfig(templatePath) {
|
|
175
|
+
const { log, cwd } = this.ctx;
|
|
176
|
+
const existingConfig = this.findOpenNextConfig();
|
|
177
|
+
if (existingConfig) {
|
|
178
|
+
log.info(`${existingConfig} found, skipping creation (opennextjs-cloudflare will validate)`);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
log.info('open-next.config not found, creating open-next.config.ts with default Webflow Cloud configuration...');
|
|
182
|
+
if (!fs.existsSync(templatePath)) {
|
|
183
|
+
throw new Error(`open-next.config.ts template not found at ${templatePath}. This is a Webflow Cloud build system error.`);
|
|
184
|
+
}
|
|
185
|
+
const configPath = path.join(cwd, 'open-next.config.ts');
|
|
186
|
+
fs.copyFileSync(templatePath, configPath);
|
|
187
|
+
log.info('open-next.config.ts created successfully');
|
|
188
|
+
}
|
|
189
|
+
async prepareConfig() {
|
|
190
|
+
const { log, cwd, userEnv } = this.ctx;
|
|
191
|
+
// Rename user's next.config.* to clouduser.next.config.*; if there is no
|
|
192
|
+
// user config, write an empty stub so the generated template's static
|
|
193
|
+
// import always resolves.
|
|
194
|
+
const renamedUserConfig = (0, utils_1.renameUserConfig)(log, cwd, 'next.config', ['mjs', 'cjs', 'js', 'ts']);
|
|
195
|
+
if (renamedUserConfig === null) {
|
|
196
|
+
log.info('no user next.config.{mjs,cjs,js,ts} found — writing empty clouduser.next.config.ts stub');
|
|
197
|
+
fs.writeFileSync(path.join(cwd, 'clouduser.next.config.ts'), 'export default {};\n');
|
|
198
|
+
}
|
|
199
|
+
else if (path.extname(renamedUserConfig) !== '.ts') {
|
|
200
|
+
// Next.js 16 type-checks next.config.ts with tsc, whose default module
|
|
201
|
+
// resolution can't find `.mjs`/`.cjs`/`.js` siblings of an extensionless
|
|
202
|
+
// import. Write a type-only shim so tsc resolves the import; runtime
|
|
203
|
+
// resolution is handled by Next.js's TS config loader and ignores .d.ts.
|
|
204
|
+
log.info(`writing clouduser.next.config.d.ts shim for ${path.basename(renamedUserConfig)}`);
|
|
205
|
+
fs.writeFileSync(path.join(cwd, 'clouduser.next.config.d.ts'), "import type { UserNextConfig } from './next.config.webflow';\ndeclare const config: UserNextConfig;\nexport default config;\n");
|
|
206
|
+
}
|
|
207
|
+
// Copy the merge-logic library (real source, not a template).
|
|
208
|
+
const webflowConfigSrc = path.join(TEMPLATE_BASE, 'next.config.webflow.ts');
|
|
209
|
+
if ((0, utils_1.fileExists)(webflowConfigSrc)) {
|
|
210
|
+
log.info('Copying next.config.webflow.ts...');
|
|
211
|
+
fs.copyFileSync(webflowConfigSrc, path.join(cwd, 'next.config.webflow.ts'));
|
|
212
|
+
}
|
|
213
|
+
// Render the single next.config.ts template.
|
|
214
|
+
const templatePath = path.join(TEMPLATE_BASE, 'next.config.ts.template');
|
|
215
|
+
const destPath = path.join(cwd, 'next.config.ts');
|
|
216
|
+
log.info('Generating next.config.ts from template...');
|
|
217
|
+
await (0, utils_1.envsubst)(log, templatePath, destPath, {
|
|
218
|
+
...process.env,
|
|
219
|
+
...userEnv,
|
|
220
|
+
});
|
|
221
|
+
// Copy webflow-loader.ts.
|
|
222
|
+
const loader = this.getWebflowLoader();
|
|
223
|
+
if ((0, utils_1.fileExists)(loader.templatePath)) {
|
|
224
|
+
log.info(`Copying ${loader.destinationName}...`);
|
|
225
|
+
fs.copyFileSync(loader.templatePath, path.join(cwd, loader.destinationName));
|
|
226
|
+
}
|
|
227
|
+
// Ensure open-next.config.ts exists.
|
|
228
|
+
this.ensureOpenNextConfig(path.join(TEMPLATE_BASE, 'open-next.config.ts'));
|
|
229
|
+
// wrangler.json is owned exclusively by `handleWranglerJson`, which runs
|
|
230
|
+
// before this hook and is the only function permitted to write
|
|
231
|
+
// /wrangler.json. Copying the framework template here would clobber its
|
|
232
|
+
// user-binding merge.
|
|
233
|
+
}
|
|
234
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
235
|
+
// BUILD
|
|
236
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
237
|
+
getBuildCommand() {
|
|
238
|
+
return 'opennextjs-cloudflare build';
|
|
239
|
+
}
|
|
240
|
+
getNodeVersionRequirement() {
|
|
241
|
+
return {
|
|
242
|
+
minimum: '18.0.0',
|
|
243
|
+
severity: 'error',
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
247
|
+
// OUTPUT
|
|
248
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
249
|
+
static getOutputDeployMetadata() {
|
|
250
|
+
return {
|
|
251
|
+
staticAssetsPath: '.open-next/assets',
|
|
252
|
+
workerEntryPath: '.open-next/worker.js',
|
|
253
|
+
deploymentType: 'ssr',
|
|
254
|
+
// After wrangler dry-run, the bundled output is ./worker.js
|
|
255
|
+
dryRunEntryPath: './worker.js',
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Detect Next.js from built output: presence of `./worker.js` (the bundled
|
|
260
|
+
* entrypoint produced by `opennextjs-cloudflare build`). Mirrors the legacy
|
|
261
|
+
* fallback the deploy phase used to hardcode.
|
|
262
|
+
*/
|
|
263
|
+
static detectFromBuiltOutput(cwd) {
|
|
264
|
+
return fs.statSync(path.join(cwd, './worker.js'), { throwIfNoEntry: false })?.isFile() ?? false;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
exports.NextJsBuilder = NextJsBuilder;
|
|
268
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/frameworks/nextjs/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Generated by the Webflow Cloud builder. Merge logic lives in ./next.config.webflow.ts.
|
|
2
|
+
import userConfig from './clouduser.next.config';
|
|
3
|
+
import { withWebflowOverrides } from './next.config.webflow';
|
|
4
|
+
|
|
5
|
+
// Next.js disallows '/' as basePath, so '/' maps to ''.
|
|
6
|
+
const mountPath: string = '${COSMIC_MOUNT_PATH}';
|
|
7
|
+
export const webflowBasePath = mountPath === '/' ? '' : mountPath;
|
|
8
|
+
export const webflowAssetPrefix = '${COSMIC_DEPLOY_URL}' + webflowBasePath;
|
|
9
|
+
|
|
10
|
+
export default withWebflowOverrides(userConfig, {
|
|
11
|
+
basePath: webflowBasePath,
|
|
12
|
+
assetPrefix: webflowAssetPrefix,
|
|
13
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Merge logic for the generated next.config.ts. Copied verbatim into the
|
|
2
|
+
// user's project; types are local to avoid Next.js cross-version drift.
|
|
3
|
+
import type { NextConfig } from 'next';
|
|
4
|
+
|
|
5
|
+
type NextConfigContext = { defaultConfig: NextConfig };
|
|
6
|
+
type UserNextConfigFn = (phase: string, ctx: NextConfigContext) => NextConfig | Promise<NextConfig>;
|
|
7
|
+
|
|
8
|
+
export type UserNextConfig = NextConfig | UserNextConfigFn;
|
|
9
|
+
export type WebflowOverridesOptions = { basePath: string; assetPrefix: string };
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Wrap the user's Next.js config with Webflow Cloud's required overrides.
|
|
13
|
+
* `userExport` is always provided — `{}` when the user ships no next.config.
|
|
14
|
+
*/
|
|
15
|
+
export function withWebflowOverrides(
|
|
16
|
+
userExport: UserNextConfig,
|
|
17
|
+
opts: WebflowOverridesOptions,
|
|
18
|
+
): UserNextConfigFn {
|
|
19
|
+
return async function nextConfig(phase: string, ctx: NextConfigContext): Promise<NextConfig> {
|
|
20
|
+
const resolved = await resolveUserConfig(userExport, phase, ctx);
|
|
21
|
+
return {
|
|
22
|
+
...resolved,
|
|
23
|
+
basePath: opts.basePath,
|
|
24
|
+
assetPrefix: opts.assetPrefix,
|
|
25
|
+
images: {
|
|
26
|
+
...resolved.images,
|
|
27
|
+
// TODO: support non-custom loaders (imgix, cloudinary, akamai) if they work
|
|
28
|
+
loader: 'custom',
|
|
29
|
+
loaderFile: resolved.images?.loaderFile || './webflow-loader.ts',
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async function resolveUserConfig(
|
|
36
|
+
userExport: UserNextConfig,
|
|
37
|
+
phase: string,
|
|
38
|
+
ctx: NextConfigContext,
|
|
39
|
+
): Promise<NextConfig> {
|
|
40
|
+
if (typeof userExport === 'function') {
|
|
41
|
+
return (await userExport(phase, ctx)) ?? {};
|
|
42
|
+
}
|
|
43
|
+
// `export default null` is rare but not impossible; guard so the spread in
|
|
44
|
+
// withWebflowOverrides can't NPE.
|
|
45
|
+
return userExport ?? {};
|
|
46
|
+
}
|