create-nextblock 0.9.70 → 0.9.72
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/bin/create-nextblock.js +7 -0
- package/package.json +1 -1
- package/templates/nextblock-template/app/api/draft/disable/route.ts +5 -2
- package/templates/nextblock-template/app/api/draft/route.ts +2 -1
- package/templates/nextblock-template/app/api/draft/start/route.ts +5 -3
- package/templates/nextblock-template/lib/visual-editing/draft-route.ts +18 -0
- package/templates/nextblock-template/package.json +1 -1
- package/templates/nextblock-template/tsconfig.tsbuildinfo +1 -1
package/bin/create-nextblock.js
CHANGED
|
@@ -2092,6 +2092,13 @@ function buildNextConfigContent(editorUtilNames) {
|
|
|
2092
2092
|
' compiler: {',
|
|
2093
2093
|
" removeConsole: process.env.NODE_ENV === 'production',",
|
|
2094
2094
|
' },',
|
|
2095
|
+
' // The published @nextblock-cms/* libs are pre-built and fully type-checked + linted in the',
|
|
2096
|
+
' // upstream monorepo, but their consumer-side type declarations are incomplete — so making',
|
|
2097
|
+
' // `next build` re-type-check/lint them would fail on imports the app uses correctly at',
|
|
2098
|
+
' // runtime. Skip build-time type-check + lint of the pre-built deps; your own code is still',
|
|
2099
|
+
' // checked in your editor (and you can run `tsc`/`eslint` directly if you want a gate).',
|
|
2100
|
+
' typescript: { ignoreBuildErrors: true },',
|
|
2101
|
+
' eslint: { ignoreDuringBuilds: true },',
|
|
2095
2102
|
'};',
|
|
2096
2103
|
'',
|
|
2097
2104
|
'module.exports = nextConfig;',
|
package/package.json
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { draftMode } from "next/headers";
|
|
2
2
|
import { NextRequest, NextResponse } from "next/server";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
normalizeDraftRedirectPath,
|
|
5
|
+
resolveRequestOrigin,
|
|
6
|
+
} from "../../../../lib/visual-editing/draft-route";
|
|
4
7
|
|
|
5
8
|
export const runtime = "nodejs";
|
|
6
9
|
export const dynamic = "force-dynamic";
|
|
@@ -19,7 +22,7 @@ export async function GET(request: NextRequest) {
|
|
|
19
22
|
const draft = await draftMode();
|
|
20
23
|
draft.disable();
|
|
21
24
|
|
|
22
|
-
const response = NextResponse.redirect(new URL(normalizedPath, request
|
|
25
|
+
const response = NextResponse.redirect(new URL(normalizedPath, resolveRequestOrigin(request)));
|
|
23
26
|
response.headers.set("Cache-Control", "no-store");
|
|
24
27
|
return response;
|
|
25
28
|
}
|
|
@@ -4,6 +4,7 @@ import { createVerificationClient } from "../../../lib/visual-editing/draft-cont
|
|
|
4
4
|
import {
|
|
5
5
|
normalizeDraftRedirectPath,
|
|
6
6
|
resolveDraftPathTarget,
|
|
7
|
+
resolveRequestOrigin,
|
|
7
8
|
type DraftPathTarget,
|
|
8
9
|
} from "../../../lib/visual-editing/draft-route";
|
|
9
10
|
|
|
@@ -87,7 +88,7 @@ export async function GET(request: NextRequest) {
|
|
|
87
88
|
const draft = await draftMode();
|
|
88
89
|
draft.enable();
|
|
89
90
|
|
|
90
|
-
const response = NextResponse.redirect(new URL(target.path, request
|
|
91
|
+
const response = NextResponse.redirect(new URL(target.path, resolveRequestOrigin(request)));
|
|
91
92
|
response.headers.set("Cache-Control", "no-store");
|
|
92
93
|
return response;
|
|
93
94
|
}
|
|
@@ -4,6 +4,7 @@ import { getCurrentUserCanEdit } from "../../../../lib/visual-editing/draft-cont
|
|
|
4
4
|
import {
|
|
5
5
|
normalizeDraftRedirectPath,
|
|
6
6
|
resolveDraftPathTarget,
|
|
7
|
+
resolveRequestOrigin,
|
|
7
8
|
type DraftPathTarget,
|
|
8
9
|
} from "../../../../lib/visual-editing/draft-route";
|
|
9
10
|
|
|
@@ -15,10 +16,11 @@ function getRequestedPath(request: NextRequest) {
|
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
function redirectToSignIn(request: NextRequest, normalizedPath: string) {
|
|
18
|
-
const
|
|
19
|
+
const origin = resolveRequestOrigin(request);
|
|
20
|
+
const retryUrl = new URL(request.nextUrl.pathname, origin);
|
|
19
21
|
retryUrl.searchParams.set("path", normalizedPath);
|
|
20
22
|
|
|
21
|
-
const signInUrl = new URL("/sign-in",
|
|
23
|
+
const signInUrl = new URL("/sign-in", origin);
|
|
22
24
|
signInUrl.searchParams.set("redirect", `${retryUrl.pathname}${retryUrl.search}`);
|
|
23
25
|
return redirectNoStore(signInUrl);
|
|
24
26
|
}
|
|
@@ -73,5 +75,5 @@ export async function GET(request: NextRequest) {
|
|
|
73
75
|
const draft = await draftMode();
|
|
74
76
|
draft.enable();
|
|
75
77
|
|
|
76
|
-
return redirectNoStore(new URL(target.path, request
|
|
78
|
+
return redirectNoStore(new URL(target.path, resolveRequestOrigin(request)));
|
|
77
79
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { NextRequest } from "next/server";
|
|
1
2
|
import type { NextblockDocumentType } from "./types";
|
|
2
3
|
|
|
3
4
|
export type DraftPathDocumentType = NextblockDocumentType | "product";
|
|
@@ -80,3 +81,20 @@ export function resolveDraftPathTarget(path: string): DraftPathTarget | null {
|
|
|
80
81
|
path: `/${encodeURIComponent(slug)}`,
|
|
81
82
|
};
|
|
82
83
|
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Browser-facing origin for a redirect. In the self-hosted Docker standalone server (binds to
|
|
87
|
+
* HOSTNAME=0.0.0.0), `request.url` / `request.nextUrl.origin` carry `http://0.0.0.0:3000` — an
|
|
88
|
+
* unroutable address that the browser rejects (ERR_ADDRESS_INVALID). The incoming `Host` header
|
|
89
|
+
* reflects what the user actually requested (e.g. localhost:3000), so prefer it (honoring
|
|
90
|
+
* `x-forwarded-proto` behind a proxy). Falls back to the request origin when no Host is present.
|
|
91
|
+
*/
|
|
92
|
+
export function resolveRequestOrigin(request: NextRequest): string {
|
|
93
|
+
const host = request.headers.get("host");
|
|
94
|
+
if (host) {
|
|
95
|
+
const forwardedProto = request.headers.get("x-forwarded-proto")?.split(",")[0]?.trim();
|
|
96
|
+
const protocol = forwardedProto || request.nextUrl.protocol.replace(/:$/, "") || "http";
|
|
97
|
+
return `${protocol}://${host}`;
|
|
98
|
+
}
|
|
99
|
+
return request.nextUrl.origin;
|
|
100
|
+
}
|