1
0
mirror of synced 2026-02-04 12:08:33 -05:00

Compare commits

...

4 Commits

Author SHA1 Message Date
Fran Zekan
946db95245 Fix package.json depend missing 2022-08-15 15:09:47 +02:00
Fran Zekan
15b95d3fd7 Fix lock file 2022-08-15 14:46:03 +02:00
Fran Zekan
a72897bcfe Add back whole config being returned 2022-08-15 14:39:37 +02:00
Fran Zekan
c3f79cea23 Extract codegen tasks and add patching nextjs validation config 2022-08-15 14:38:40 +02:00
8 changed files with 133 additions and 75 deletions

View File

@@ -240,8 +240,7 @@ export function withBlitz(nextConfig: BlitzConfig = {}) {
},
})
const {blitz, ...rest} = config
return rest
return config
}
export type PrefetchQueryFn = <T extends AsyncFunc, TInput = FirstParam<T>>(

View File

@@ -47,6 +47,7 @@
"prompts": "2.4.2",
"resolve-cwd": "3.0.0",
"resolve-from": "5.0.0",
"semver": "7.3.7",
"superjson": "1.8.0",
"supports-color": "8.1.1",
"ts-node": "10.7.0",

View File

@@ -1,54 +0,0 @@
import {generateManifest} from "./routes-manifest"
import {log} from "../../logging"
import resolveCwd from "resolve-cwd"
import {join} from "path"
import fs from "fs-extra"
import {getPackageJson} from "./get-package-json"
import {runPrisma} from "../../utils/run-prisma"
export const codegenTasks = async () => {
try {
/*
Updates the user's nextjs file and adds onRecoverableError to the hydrateRoot 3rd parameter object.
We can remove this when https://github.com/vercel/next.js/pull/38207 is merged into next.js
*/
const nextDir = await resolveCwd("next")
const nextClientIndex = join(nextDir, "../..", "client", "index.js")
const readFile = await fs.readFile(nextClientIndex)
const updatedFile = readFile
.toString()
.replace(
/ReactDOM\.hydrateRoot\(.*?\);/,
`ReactDOM.hydrateRoot(domEl, reactEl, process.env.NODE_ENV === 'development' ? {onRecoverableError: (err) => err.toString().includes("could not finish this Suspense boundary") ? null : console.error(err)} : undefined);`,
)
await fs.writeFile(nextClientIndex, updatedFile)
log.success("Next.js was successfully patched with a React Suspense fix")
} catch (err) {
log.error(JSON.stringify(err, null, 2))
}
try {
await generateManifest()
log.success("Routes manifest was successfully generated")
const {dependencies, devDependencies} = await getPackageJson()
const hasPrisma = Object.keys({...dependencies, ...devDependencies}).some(
(name) => name === "prisma",
)
if (hasPrisma) {
let prismaSpinner = log.spinner(`Generating Prisma client`).start()
const result = await runPrisma(["generate"], true)
if (result.success) {
prismaSpinner.succeed(log.greenText("Generated Prisma client"))
} else {
prismaSpinner.fail()
console.log("\n" + result.stderr)
process.exit(1)
}
}
} catch (err) {
log.error(JSON.stringify(err, null, 2))
}
}

View File

@@ -0,0 +1,22 @@
import {log} from "../../../logging"
import {runPrisma} from "../../../utils/run-prisma"
import {getPackageJson} from "../get-package-json"
export const generatePrismaClient = async () => {
const {dependencies, devDependencies} = await getPackageJson()
const hasPrisma = Object.keys({...dependencies, ...devDependencies}).some(
(name) => name === "prisma",
)
if (hasPrisma) {
let prismaSpinner = log.spinner(`Generating Prisma client`).start()
const result = await runPrisma(["generate"], true)
if (result.success) {
prismaSpinner.succeed(log.greenText("Generated Prisma client"))
} else {
prismaSpinner.fail()
console.log("\n" + result.stderr)
process.exit(1)
}
}
}

View File

@@ -0,0 +1,25 @@
import {generateManifest} from "../routes-manifest"
import {log} from "../../../logging"
import {generatePrismaClient} from "./generatePrisma"
import {patchNextSuspenseBug, patchNextConfigWarning} from "./patchNextJs"
const _tryCatch = async (fn: () => Promise<unknown>) => {
try {
await fn()
} catch (err) {
log.error(JSON.stringify(err, null, 2))
}
}
export const codegenTasks = async () => {
await _tryCatch(patchNextSuspenseBug)
await _tryCatch(patchNextConfigWarning)
await _tryCatch(async () => {
await generateManifest()
log.success("Routes manifest was successfully generated")
})
await _tryCatch(generatePrismaClient)
}

View File

@@ -0,0 +1,63 @@
import {join} from "path"
import semver from "semver"
import resolveCwd from "resolve-cwd"
import fs from "fs-extra"
import {log} from "../../../logging"
import {getPackageJson} from "../get-package-json"
const modifyNextFile = async (
path: string,
replacer: (str: string) => string,
semverCheck?: (version: string) => boolean,
) => {
const nextDir = resolveCwd("next")
if (semverCheck) {
const pkgJson = await getPackageJson(nextDir)
if (!semverCheck(pkgJson.version)) {
return
}
}
const nextClientIndex = join(nextDir, path)
const readFile = await fs.readFile(nextClientIndex)
const updatedFile = replacer(readFile.toString())
await fs.writeFile(nextClientIndex, updatedFile)
}
export const patchNextSuspenseBug = async () => {
/*
Updates the user's nextjs file and adds onRecoverableError to the hydrateRoot 3rd parameter object.
We can remove this when https://github.com/vercel/next.js/pull/38207 is merged into next.js
*/
await modifyNextFile("../../client/index.js", (str) => {
return str.replace(
/ReactDOM\.hydrateRoot\(.*?\);/,
`ReactDOM.hydrateRoot(domEl, reactEl, process.env.NODE_ENV === 'development' ? {onRecoverableError: (err) => err.toString().includes("could not finish this Suspense boundary") ? null : console.error(err)} : undefined);`,
)
})
log.success("Next.js was successfully patched with a React Suspense fix")
}
export const patchNextConfigWarning = async () => {
/*
Updates the user's nextjs config validation to add blitz as a valid prop in the config schema
We can remove this when https://github.com/vercel/next.js/issues/39606 issue gets resolved
*/
await modifyNextFile(
"../../client/index.js",
(str) => {
return str.replace(
/type:"object",additionalProperties:false,properties:{amp:{/,
`type:"object",additionalProperties:false,properties:{blitz:{type:"any"},amp:{`,
)
},
(version) => semver.gte(version, "12.2.3"),
)
log.success("Next.js was successfully patched with config warning fix")
}

View File

@@ -2,8 +2,8 @@ import {existsSync} from "fs"
import {readJSON} from "fs-extra"
import {join} from "path"
export const getPackageJson = async () => {
const pkgJsonPath = join(process.cwd(), "package.json")
export const getPackageJson = async (path = process.cwd()) => {
const pkgJsonPath = join(path, "package.json")
if (existsSync(pkgJsonPath)) {
return readJSON(pkgJsonPath)
}

36
pnpm-lock.yaml generated
View File

@@ -49,7 +49,7 @@ importers:
"@types/preview-email": 2.0.1
"@types/react": 18.0.1
"@typescript-eslint/eslint-plugin": 5.9.1
blitz: workspace:2.0.0-beta.0
blitz: workspace:2.0.0-beta.1
eslint: 7.32.0
eslint-config-next: 12.2.0
eslint-config-prettier: 8.5.0
@@ -524,8 +524,8 @@ importers:
packages/blitz:
specifiers:
"@blitzjs/config": workspace:2.0.0-beta.0
"@blitzjs/generator": 2.0.0-beta.0
"@blitzjs/config": workspace:2.0.0-beta.1
"@blitzjs/generator": 2.0.0-beta.1
"@types/cookie": 0.4.1
"@types/cross-spawn": 6.0.2
"@types/debug": 4.1.7
@@ -566,6 +566,7 @@ importers:
react: 18.0.0
resolve-cwd: 3.0.0
resolve-from: 5.0.0
semver: 7.3.7
superjson: 1.8.0
supports-color: 8.1.1
test-listen: 1.1.0
@@ -602,6 +603,7 @@ importers:
prompts: 2.4.2
resolve-cwd: 3.0.0
resolve-from: 5.0.0
semver: 7.3.7
superjson: 1.8.0_supports-color@8.1.1
supports-color: 8.1.1
ts-node: 10.7.0_typescript@4.6.3
@@ -635,7 +637,7 @@ importers:
packages/blitz-auth:
specifiers:
"@blitzjs/config": workspace:2.0.0-beta.0
"@blitzjs/config": workspace:2.0.0-beta.1
"@testing-library/react": 13.0.0
"@testing-library/react-hooks": 7.0.2
"@types/b64-lite": 1.3.0
@@ -649,7 +651,7 @@ importers:
"@types/secure-password": 3.1.1
b64-lite: 1.4.0
bad-behavior: 1.0.1
blitz: 2.0.0-beta.0
blitz: 2.0.0-beta.1
cookie: 0.4.1
cookie-session: 2.0.0
debug: 4.3.3
@@ -702,8 +704,8 @@ importers:
packages/blitz-next:
specifiers:
"@blitzjs/config": workspace:2.0.0-beta.0
"@blitzjs/rpc": 2.0.0-beta.0
"@blitzjs/config": workspace:2.0.0-beta.1
"@blitzjs/rpc": 2.0.0-beta.1
"@tanstack/react-query": 4.0.10
"@testing-library/dom": 8.13.0
"@testing-library/jest-dom": 5.16.3
@@ -715,7 +717,7 @@ importers:
"@types/react": 18.0.1
"@types/react-dom": 17.0.14
"@types/testing-library__react-hooks": 4.0.0
blitz: 2.0.0-beta.0
blitz: 2.0.0-beta.1
cross-spawn: 7.0.3
debug: 4.3.3
find-up: 4.1.0
@@ -765,15 +767,15 @@ importers:
packages/blitz-rpc:
specifiers:
"@blitzjs/auth": 2.0.0-beta.0
"@blitzjs/config": workspace:2.0.0-beta.0
"@blitzjs/auth": 2.0.0-beta.1
"@blitzjs/config": workspace:2.0.0-beta.1
"@tanstack/react-query": 4.0.10
"@types/debug": 4.1.7
"@types/react": 18.0.1
"@types/react-dom": 17.0.14
b64-lite: 1.4.0
bad-behavior: 1.0.1
blitz: 2.0.0-beta.0
blitz: 2.0.0-beta.1
chalk: ^4.1.0
debug: 4.3.3
next: 12.2.0
@@ -816,12 +818,12 @@ importers:
"@babel/plugin-syntax-typescript": 7.17.12
"@babel/preset-env": 7.12.10
"@blitzjs/config": workspace:*
"@blitzjs/generator": 2.0.0-beta.0
"@blitzjs/generator": 2.0.0-beta.1
"@types/jscodeshift": 0.11.2
"@types/node": 17.0.16
arg: 5.0.1
ast-types: 0.14.2
blitz: 2.0.0-beta.0
blitz: 2.0.0-beta.1
chalk: ^4.1.0
cross-spawn: 7.0.3
debug: 4.3.3
@@ -876,7 +878,7 @@ importers:
"@babel/plugin-transform-typescript": 7.12.1
"@babel/preset-env": 7.12.10
"@babel/types": 7.12.10
"@blitzjs/config": 2.0.0-beta.0
"@blitzjs/config": 2.0.0-beta.1
"@juanm04/cpx": 2.0.1
"@mrleebo/prisma-ast": 0.2.6
"@types/babel__core": 7.1.19
@@ -969,7 +971,7 @@ importers:
packages/pkg-template:
specifiers:
"@blitzjs/config": 2.0.0-beta.0
"@blitzjs/config": 2.0.0-beta.1
"@types/react": 18.0.1
"@types/react-dom": 17.0.14
"@typescript-eslint/eslint-plugin": 5.9.1
@@ -12070,7 +12072,7 @@ packages:
pretty-format: 27.5.1
slash: 3.0.0
strip-json-comments: 3.1.1
ts-node: 10.7.0_fxg3r7oju3tntkxsvleuiot4fa
ts-node: 10.7.0_typescript@4.6.3
transitivePeerDependencies:
- bufferutil
- canvas
@@ -17356,6 +17358,7 @@ packages:
typescript: 4.6.3
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
dev: false
/ts-node/10.7.0_typescript@4.6.3:
resolution:
@@ -17388,7 +17391,6 @@ packages:
typescript: 4.6.3
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
dev: false
/tsconfig-paths/3.14.1:
resolution: