diff --git a/babel.config.js b/babel.config.js index 33f34bcf9d..0f4bc29ec3 100644 --- a/babel.config.js +++ b/babel.config.js @@ -19,6 +19,11 @@ module.exports = { "babel-plugin-dev-expression", ["@babel/plugin-proposal-class-properties", {loose: true}], "babel-plugin-macros", - // ["babel-plugin-polyfill-regenerator", {method: "usage-pure"}], + [ + "transform-inline-environment-variables", + { + include: ["BLITZ_PROD_BUILD"], + }, + ], ], } diff --git a/examples/auth/blitz.config.js b/examples/auth/blitz.config.js index d7351e8f22..5bc0d36572 100644 --- a/examples/auth/blitz.config.js +++ b/examples/auth/blitz.config.js @@ -1,23 +1,24 @@ const {sessionMiddleware, simpleRolesIsAuthorized} = require("@blitzjs/server") +const withMonorepoBuildTooling = require("@preconstruct/next") const withBundleAnalyzer = require("@next/bundle-analyzer")({ enabled: process.env.ANALYZE === "true", }) -// withPreconstruct only needed for our internal monorepo -module.exports = withBundleAnalyzer({ - middleware: [ - sessionMiddleware({ - isAuthorized: simpleRolesIsAuthorized, - // sessionExpiryMinutes: 4, - }), - ], - log: { - // level: "trace", - }, - experimental: { - isomorphicResolverImports: false, - }, - /* +module.exports = withMonorepoBuildTooling( + withBundleAnalyzer({ + middleware: [ + sessionMiddleware({ + isAuthorized: simpleRolesIsAuthorized, + // sessionExpiryMinutes: 4, + }), + ], + log: { + // level: "trace", + }, + experimental: { + isomorphicResolverImports: false, + }, + /* webpack: (config, {buildId, dev, isServer, defaultLoaders, webpack}) => { // Note: we provide webpack above so you should not `require` it // Perform customizations to webpack config @@ -30,4 +31,5 @@ module.exports = withBundleAnalyzer({ return config }, */ -}) + }), +) diff --git a/examples/custom-server/blitz.config.js b/examples/custom-server/blitz.config.js index cd2ed4d23a..39fe53f7c1 100644 --- a/examples/custom-server/blitz.config.js +++ b/examples/custom-server/blitz.config.js @@ -1,6 +1,7 @@ const {sessionMiddleware, simpleRolesIsAuthorized} = require("@blitzjs/server") +const withMonorepoBuildTooling = require("@preconstruct/next") -module.exports = { +module.exports = withMonorepoBuildTooling({ middleware: [ sessionMiddleware({ isAuthorized: simpleRolesIsAuthorized, @@ -14,4 +15,4 @@ module.exports = { return config }, */ -} +}) diff --git a/examples/fauna/blitz.config.js b/examples/fauna/blitz.config.js index f153c2579f..5a4b551140 100644 --- a/examples/fauna/blitz.config.js +++ b/examples/fauna/blitz.config.js @@ -1,4 +1,5 @@ const { sessionMiddleware, simpleRolesIsAuthorized } = require("@blitzjs/server") +const withMonorepoBuildTooling = require("@preconstruct/next") const { GraphQLClient, gql } = require("graphql-request") const graphQLClient = new GraphQLClient("https://graphql.fauna.com/graphql", { @@ -17,7 +18,7 @@ const normalizeSession = (faunaSession) => { } } -module.exports = { +module.exports = withMonorepoBuildTooling({ middleware: [ sessionMiddleware({ isAuthorized: simpleRolesIsAuthorized, @@ -158,4 +159,4 @@ module.exports = { return config }, */ -} +}) diff --git a/examples/no-prisma/blitz.config.js b/examples/no-prisma/blitz.config.js index 3b17b02ef1..891863f454 100644 --- a/examples/no-prisma/blitz.config.js +++ b/examples/no-prisma/blitz.config.js @@ -1,4 +1,6 @@ -module.exports = { +const withMonorepoBuildTooling = require("@preconstruct/next") + +module.exports = withMonorepoBuildTooling({ webpack: (config, { buildId, dev, isServer, defaultLoaders, webpack }) => { // Note: we provide webpack above so you should not `require` it // Perform customizations to webpack config @@ -10,4 +12,4 @@ module.exports = { // Important: return the modified config return config }, -} +}) diff --git a/examples/store/blitz.config.js b/examples/store/blitz.config.js index 926699068b..c80a855737 100644 --- a/examples/store/blitz.config.js +++ b/examples/store/blitz.config.js @@ -1,4 +1,6 @@ -module.exports = { +const withMonorepoBuildTooling = require("@preconstruct/next") + +module.exports = withMonorepoBuildTooling({ middleware: [ (req, res, next) => { res.blitzCtx.referer = req.headers.referer @@ -22,4 +24,4 @@ module.exports = { // // Important: return the modified config // return config // }, -} +}) diff --git a/package.json b/package.json index 70c215aa41..6ce8a22f3c 100644 --- a/package.json +++ b/package.json @@ -24,13 +24,11 @@ }, "scripts": { "postinstall": "npm rebuild husky", - "waitfortypes": "wait-on packages/core/dist/blitzjs-core.esm.js && wait-on packages/server/dist/blitzjs-server.esm.js", - "dev:preconstruct": "preconstruct watch", - "dev:tsc": "yarn waitfortypes && tsc --watch --pretty --preserveWatchOutput", - "dev:cli": "yarn waitfortypes && yarn workspace @blitzjs/cli dev", - "dev:templates": "yarn waitfortypes && yarn workspace @blitzjs/generator dev", - "dev": "concurrently --names \"BUILD,TYPES,CLI,TEMPLATES\" -c \"blue,magenta,yellow,green\" \"npm:dev:preconstruct\" \"npm:dev:tsc\" \"npm:dev:cli\" \"npm:dev:templates\"", - "build": "preconstruct build && lerna run build --scope @blitzjs/* && tsc", + "dev:tsc": "tsc --watch --pretty --preserveWatchOutput", + "dev:cli": "yarn workspace @blitzjs/cli dev", + "dev:templates": "yarn workspace @blitzjs/generator dev", + "dev": "preconstruct dev && concurrently --names \"typecheck,cli,templates\" -c \"blue,green,yellow,magenta\" -p \"{name}\" \"npm:dev:tsc\" \"npm:dev:cli\" \"npm:dev:templates\"", + "build": "cross-env BLITZ_PROD_BUILD=true preconstruct build && lerna run build --scope @blitzjs/* && tsc", "lint": "eslint --ignore-path .gitignore --ignore-pattern types --ext \".js,.ts,.tsx\" .", "link-cli": "yarn workspace blitz link", "unlink-cli": "yarn workspace blitz unlink", @@ -59,6 +57,7 @@ "@babel/preset-typescript": "7.13.0", "@manypkg/cli": "0.17.0", "@preconstruct/cli": "2.0.5", + "@preconstruct/next": "2.0.0", "@rollup/pluginutils": "4.1.0", "@size-limit/preset-small-lib": "4.9.2", "@testing-library/jest-dom": "5.11.9", @@ -113,6 +112,7 @@ "babel-plugin-annotate-pure-calls": "0.4.0", "babel-plugin-dev-expression": "0.2.2", "babel-plugin-macros": "3.0.1", + "babel-plugin-transform-inline-environment-variables": "0.4.3", "concurrently": "6.0.0", "cpx": "1.5.0", "cross-env": "7.0.3", diff --git a/packages/cli/package.json b/packages/cli/package.json index 94b39eb6e4..112ddfdac7 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -4,7 +4,7 @@ "version": "0.30.6", "license": "MIT", "scripts": { - "dev": "rimraf lib && tsc --watch --preserveWatchOutput", + "dev": "rimraf lib && tsc --watch --pretty --preserveWatchOutput", "build": "rimraf lib && tsc", "test": "jest --color", "test:watch": "jest --watch", diff --git a/packages/cli/src/commands/build.ts b/packages/cli/src/commands/build.ts index bdd10bb92c..963a30ca59 100644 --- a/packages/cli/src/commands/build.ts +++ b/packages/cli/src/commands/build.ts @@ -1,5 +1,5 @@ import {Command, flags} from "@oclif/command" -import {build as ServerBuild, ServerConfig} from "@blitzjs/server" +import {ServerConfig} from "@blitzjs/server" export class Build extends Command { static description = "Creates a production build" @@ -17,7 +17,7 @@ export class Build extends Command { this.parse(Build) try { - const build: typeof ServerBuild = require("@blitzjs/server").build + const {build} = await import("@blitzjs/server") await build(config) } catch (err) { console.error(err) diff --git a/packages/core/src/middleware.ts b/packages/core/src/middleware.ts index 6b5592ac54..3af564056d 100644 --- a/packages/core/src/middleware.ts +++ b/packages/core/src/middleware.ts @@ -48,7 +48,7 @@ export async function handleRequestWithMiddleware( } = {}, ) { if (!(res as MiddlewareResponse).blitzCtx) { - ;(res as MiddlewareResponse).blitzCtx = {} + ;(res as MiddlewareResponse).blitzCtx = {} as Ctx } if (!(res as any)._blitz) { ;(res as any)._blitz = {} diff --git a/packages/core/src/passport-adapter.ts b/packages/core/src/passport-adapter.ts index 336a1e26f1..c5bc61c51e 100644 --- a/packages/core/src/passport-adapter.ts +++ b/packages/core/src/passport-adapter.ts @@ -65,7 +65,7 @@ export function passportAuth(config: BlitzPassportConfig) { log.info(`Starting authentication via ${strategyName}...`) if (req.query.redirectUrl) { middleware.push(async (req, res, next) => { - const session = res.blitzCtx.session as SessionContext + const session = (res as any).blitzCtx.session as SessionContext assert(session, "Missing Blitz sessionMiddleware!") await session.$setPublicData({[INTERNAL_REDIRECT_URL_KEY]: req.query.redirectUrl} as any) return next() diff --git a/packages/core/src/public-data-store.ts b/packages/core/src/public-data-store.ts index 749c3fb657..f7c13fc094 100644 --- a/packages/core/src/public-data-store.ts +++ b/packages/core/src/public-data-store.ts @@ -1,13 +1,13 @@ import BadBehavior from "bad-behavior" import {COOKIE_PUBLIC_DATA_TOKEN, LOCALSTORAGE_PREFIX} from "./constants" -import {PublicData} from "./types" +import {EmptyPublicData, PublicData} from "./types" import {deleteCookie, readCookie} from "./utils/cookie" import {parsePublicDataToken} from "./utils/tokens" class PublicDataStore { private eventKey = `${LOCALSTORAGE_PREFIX}publicDataUpdated` - readonly emptyPublicData: PublicData = {userId: null} - readonly observable = BadBehavior() + readonly emptyPublicData: EmptyPublicData = {userId: null} + readonly observable = BadBehavior() constructor() { if (typeof window !== "undefined") { @@ -22,7 +22,7 @@ class PublicDataStore { } } - updateState(value?: PublicData, opts?: {suppressEvent: boolean}) { + updateState(value?: PublicData | EmptyPublicData, opts?: {suppressEvent: boolean}) { // We use localStorage as a message bus between tabs. // Setting the current time in ms will cause other tabs to receive the `storage` event if (!opts?.suppressEvent) { diff --git a/packages/core/src/resolver.ts b/packages/core/src/resolver.ts index d73dcda72e..8522c92489 100644 --- a/packages/core/src/resolver.ts +++ b/packages/core/src/resolver.ts @@ -18,7 +18,7 @@ export interface AuthenticatedMiddlewareCtx extends Omit { session: AuthenticatedSessionContext } -type PipeFn = ( +type PipeFn = ( i: Await, c: PrevCtx, ) => Next extends ResultWithContext ? never : Next | ResultWithContext diff --git a/packages/core/src/supertokens.ts b/packages/core/src/supertokens.ts index 510b5e0c8c..722602ed8d 100644 --- a/packages/core/src/supertokens.ts +++ b/packages/core/src/supertokens.ts @@ -4,7 +4,7 @@ import {COOKIE_CSRF_TOKEN, COOKIE_LEGACY_CSRF_TOKEN} from "./constants" import {AuthenticationError} from "./errors" import {Ctx} from "./middleware" import {publicDataStore} from "./public-data-store" -import {IsAuthorizedArgs, PublicData} from "./types" +import {EmptyPublicData, IsAuthorizedArgs, PublicData} from "./types" import {isServer} from "./utils" import {readCookie} from "./utils/cookie" @@ -48,9 +48,8 @@ export interface SessionContextBase { } // Could be anonymous -export interface SessionContext extends SessionContextBase, Partial { - userId: PublicData["userId"] | null - $publicData: Partial +export interface SessionContext extends SessionContextBase, EmptyPublicData { + $publicData: Partial | EmptyPublicData } export interface AuthenticatedSessionContext extends SessionContextBase, PublicData { @@ -61,8 +60,7 @@ export interface AuthenticatedSessionContext extends SessionContextBase, PublicD export const getAntiCSRFToken = () => readCookie(COOKIE_CSRF_TOKEN()) || readCookie(COOKIE_LEGACY_CSRF_TOKEN()) -export interface ClientSession extends Partial { - userId: PublicData["userId"] | null +export interface ClientSession extends EmptyPublicData { isLoading: boolean } @@ -109,7 +107,7 @@ export const useAuthenticatedSession = ( options: UseSessionOptions = {}, ): AuthenticatedClientSession => { useAuthorize() - return useSession(options) + return useSession(options) as AuthenticatedClientSession } export const useAuthorize = () => { diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 17411cc394..d9ddda7090 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -11,6 +11,7 @@ import { import {AuthenticateOptions, Strategy} from "passport" import {MutateOptions, MutationResult} from "react-query" import {BlitzRuntimeData} from "./blitz-data" +import {Ctx} from "./middleware" import {useParams} from "./use-params" import {useRouterQuery} from "./use-router-query" @@ -54,7 +55,12 @@ export interface Session { // PublicData can be injected here (see supertokens.ts) } -export type PublicData = "PublicData" extends keyof Session ? Session["PublicData"] : {userId: any} +export type PublicData = "PublicData" extends keyof Session + ? Session["PublicData"] + : {userId: unknown} +export interface EmptyPublicData extends Partial> { + userId: PublicData["userId"] | null +} export type IsAuthorizedArgs = "isAuthorized" extends keyof Session ? "args" extends keyof Parameters[0] @@ -65,13 +71,13 @@ export type IsAuthorizedArgs = "isAuthorized" extends keyof Session export interface MiddlewareRequest extends BlitzApiRequest { protocol?: string } -export interface MiddlewareResponse extends BlitzApiResponse { +export interface MiddlewareResponse extends BlitzApiResponse { /** * This will be passed as the second argument to Blitz queries/mutations. * * You must set blitzCtx BEFORE calling next() */ - blitzCtx: Record + blitzCtx: C /** * This is the exact result returned from the Blitz query/mutation * diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index 040cc96b41..68bf4d4603 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -16,8 +16,10 @@ export * from "./supertokens" import next from "next" // Support commonjs `require('blitz')` -module.exports = next -exports = module.exports +if (process.env.BLITZ_PROD_BUILD) { + module.exports = next + exports = module.exports +} // eslint-disable-next-line import/no-default-export export default next diff --git a/packages/server/src/supertokens.test.ts b/packages/server/src/supertokens.test.ts index 42a44251a4..19ff9d59ae 100644 --- a/packages/server/src/supertokens.test.ts +++ b/packages/server/src/supertokens.test.ts @@ -45,7 +45,7 @@ describe("supertokens", () => { }) as unknown) as EnhancedResolver resolverModule.middleware = [ (_req, res, next) => { - expect(typeof (res.blitzCtx.session as SessionContext).$create).toBe("function") + expect(typeof ((res as any).blitzCtx.session as SessionContext).$create).toBe("function") return next() }, ] @@ -89,7 +89,7 @@ describe("supertokens", () => { }) as unknown) as EnhancedResolver resolverModule.middleware = [ (_req, res, next) => { - expect(typeof (res.blitzCtx.session as SessionContext).$create).toBe("function") + expect(typeof ((res as any).blitzCtx.session as SessionContext).$create).toBe("function") return next() }, ] diff --git a/packages/server/src/supertokens.ts b/packages/server/src/supertokens.ts index 6254a275f5..af7e4670fc 100644 --- a/packages/server/src/supertokens.ts +++ b/packages/server/src/supertokens.ts @@ -11,6 +11,8 @@ import { COOKIE_REFRESH_TOKEN, COOKIE_SESSION_TOKEN, CSRFTokenMismatchError, + Ctx, + EmptyPublicData, generateToken, HANDLE_SEPARATOR, hash256, @@ -99,8 +101,9 @@ export interface SimpleRolesIsAuthorized { export const simpleRolesIsAuthorized: SimpleRolesIsAuthorized = ({ctx, args}) => { const [roleOrRoles] = args - const publicData = (ctx.session as SessionContext).$publicData as PublicData & - ({roles: unknown} | {role: unknown}) + const publicData = (ctx.session as SessionContext).$publicData as + | {roles: unknown} + | {role: unknown} if ("role" in publicData && "roles" in publicData) { throw new Error("Session publicData can only have only `role` or `roles`, but not both.'") @@ -152,7 +155,7 @@ export const sessionMiddleware = (sessionConfig: Partial = {}): M } as Required return async (req, res, next) => { - if (req.method !== "HEAD" && !res.blitzCtx.session) { + if (req.method !== "HEAD" && !(res.blitzCtx as any).session) { // This function also saves session to res.blitzCtx await getSessionContext(req, res) } @@ -163,7 +166,7 @@ export const sessionMiddleware = (sessionConfig: Partial = {}): M type JwtPayload = AnonymousSessionPayload | null type AnonSessionKernel = { handle: string - publicData: PublicData + publicData: EmptyPublicData jwtPayload: JwtPayload antiCSRFToken: string anonymousSessionToken: string @@ -197,7 +200,7 @@ function ensureMiddlewareResponse( res: BlitzApiResponse | ServerResponse, ): asserts res is MiddlewareResponse { if (!("blitzCtx" in res)) { - ;(res as MiddlewareResponse).blitzCtx = {} + ;(res as MiddlewareResponse).blitzCtx = {} as Ctx } } @@ -208,11 +211,11 @@ export async function getSessionContext( ensureBlitzApiRequest(req) ensureMiddlewareResponse(res) - if (res.blitzCtx.session) { - return res.blitzCtx.session as SessionContext - } + let response = res as MiddlewareResponse<{session?: SessionContext}> - // ensureMiddlewareResponse(res) + if (response.blitzCtx.session) { + return response.blitzCtx.session + } let sessionKernel = await getSession(req, res) @@ -226,7 +229,7 @@ export async function getSessionContext( } const sessionContext = makeProxyToPublicData(new SessionContextClass(req, res, sessionKernel)) - res.blitzCtx.session = sessionContext + response.blitzCtx.session = sessionContext return sessionContext } @@ -282,8 +285,13 @@ export class SessionContextClass implements SessionContext { } async $create(publicData: PublicData, privateData?: Record) { - this._kernel = await createNewSession(this._req, this._res, publicData, privateData, { + this._kernel = await createNewSession({ + req: this._req, + res: this._res, + publicData, + privateData, jwtPayload: this._kernel.jwtPayload, + anonymous: false, }) } @@ -358,7 +366,7 @@ export const parseSessionToken = (token: string) => { } } -export const createPublicDataToken = (publicData: string | PublicData) => { +export const createPublicDataToken = (publicData: string | PublicData | EmptyPublicData) => { const payload = typeof publicData === "string" ? publicData : JSON.stringify(publicData) return toBase64(payload) } @@ -368,7 +376,7 @@ export const createAntiCSRFToken = () => generateToken(TOKEN_LENGTH) export type AnonymousSessionPayload = { isAnonymous: true handle: string - publicData: PublicData + publicData: EmptyPublicData antiCSRFToken: string } @@ -670,28 +678,42 @@ export async function getSession( // -------------------------------- // Create Session // -------------------------------- +interface CreateNewAnonSession { + req: IncomingMessage + res: ServerResponse + publicData: EmptyPublicData + privateData?: Record + anonymous: true + jwtPayload?: JwtPayload +} +interface CreateNewAuthedSession { + req: IncomingMessage + res: ServerResponse + publicData: PublicData + privateData?: Record + anonymous: false + jwtPayload?: JwtPayload +} + export async function createNewSession( - req: IncomingMessage, - res: ServerResponse, - publicData: PublicData, - privateData: Record = {}, - opts: {anonymous?: boolean; jwtPayload?: JwtPayload} = {}, + args: CreateNewAnonSession | CreateNewAuthedSession, ): Promise { - assert(publicData.userId !== undefined, "You must provide publicData.userId") + const {req, res} = args + assert(args.publicData.userId !== undefined, "You must provide publicData.userId") const antiCSRFToken = createAntiCSRFToken() - if (opts.anonymous) { + if (args.anonymous) { debug("Creating new anonymous session") const handle = generateAnonymousSessionHandle() const payload: AnonymousSessionPayload = { isAnonymous: true, handle, - publicData, + publicData: args.publicData, antiCSRFToken, } const anonymousSessionToken = createAnonymousSessionToken(payload) - const publicDataToken = createPublicDataToken(publicData) + const publicDataToken = createPublicDataToken(args.publicData) const expiresAt = addYears(new Date(), 30) setAnonymousSessionCookie(req, res, anonymousSessionToken, expiresAt) @@ -704,7 +726,7 @@ export async function createNewSession( return { handle, - publicData, + publicData: args.publicData, jwtPayload: payload, antiCSRFToken, anonymousSessionToken, @@ -713,27 +735,27 @@ export async function createNewSession( debug("Creating new session") const newPublicData: PublicData = { // This carries over any public data from the anonymous session - ...(opts.jwtPayload?.publicData || {}), - ...publicData, + ...(args.jwtPayload?.publicData || {}), + ...args.publicData, } assert(newPublicData.userId, "You must provide a non-empty userId as publicData.userId") // This carries over any private data from the anonymous session let existingPrivateData = {} - if (opts.jwtPayload?.isAnonymous) { - const session = await config.getSession(opts.jwtPayload.handle) + if (args.jwtPayload?.isAnonymous) { + const session = await config.getSession(args.jwtPayload.handle) if (session) { if (session.privateData) { existingPrivateData = JSON.parse(session.privateData) } // Delete the previous anonymous session - await config.deleteSession(opts.jwtPayload.handle) + await config.deleteSession(args.jwtPayload.handle) } } const newPrivateData: Record = { ...existingPrivateData, - ...privateData, + ...args.privateData, } const expiresAt = addMinutes(new Date(), config.sessionExpiryMinutes) @@ -776,7 +798,7 @@ export async function createNewSession( } export async function createAnonymousSession(req: IncomingMessage, res: ServerResponse) { - return await createNewSession(req, res, {userId: null}, undefined, {anonymous: true}) + return await createNewSession({req, res, publicData: {userId: null}, anonymous: true}) } // -------------------------------- @@ -835,12 +857,12 @@ export async function refreshSession( } } -export async function getAllSessionHandlesForUser(userId: string) { +export async function getAllSessionHandlesForUser(userId: PublicData["userId"]) { return (await config.getSessions(userId)).map((session) => session.handle) } export async function syncPubicDataFieldsForUserIfNeeded( - userId: string | number, + userId: PublicData["userId"], data: Record, ) { const dataToSync: Record = {} @@ -901,13 +923,15 @@ export async function revokeMultipleSessions( export async function revokeAllSessionsForUser( req: IncomingMessage, res: ServerResponse, - userId: string | number, + userId: PublicData["userId"], ) { let sessionHandles = (await config.getSessions(userId)).map((session) => session.handle) return revokeMultipleSessions(req, res, sessionHandles) } -export async function getPublicData(sessionKernel: SessionKernel): Promise { +export async function getPublicData( + sessionKernel: SessionKernel, +): Promise { if (sessionKernel.jwtPayload?.publicData) { return sessionKernel.jwtPayload?.publicData } else { @@ -957,10 +981,10 @@ export async function setPublicData( // Don't allow updating userId delete data.userId - const publicData: PublicData = { + const publicData = { ...(await getPublicData(sessionKernel)), ...data, - } + } as PublicData await refreshSession(req, res, {...sessionKernel, publicData}, {publicDataChanged: true}) return publicData diff --git a/packages/server/src/with-blitz.ts b/packages/server/src/with-blitz.ts index 73980a239a..765dbc40ce 100644 --- a/packages/server/src/with-blitz.ts +++ b/packages/server/src/with-blitz.ts @@ -31,8 +31,8 @@ export function withBlitz(nextConfig: any) { ...(doesDbModuleExist() ? {"../blitz/db": "./db/index"} : {}), }) } else { - config.module ??= {} - config.module.rules = config.module.rules || [] + config.module = config.module ?? {} + config.module.rules = config.module.rules ?? [] const excluded = [ /node_modules[\\/]passport/, /node_modules[\\/]cookie-session/, @@ -99,14 +99,6 @@ export function withBlitz(nextConfig: any) { ) } - // We add next-transpile-modules during internal blitz development so that changes in blitz - // framework code will trigger a hot reload of any example apps that are running - const isInternalBlitzDevelopment = __dirname.includes("packages/server/src") - if (isInternalBlitzDevelopment) { - const withTM = require("next-transpile-modules")(["@blitzjs/core", "@blitzjs/server"]) - return withTM(newConfig) - } else { - return newConfig - } + return newConfig } } diff --git a/yarn.lock b/yarn.lock index 609ec96489..f7b2579938 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3382,6 +3382,13 @@ pirates "^4.0.1" source-map-support "^0.5.16" +"@preconstruct/next@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@preconstruct/next/-/next-2.0.0.tgz#050042c13dde0c671bee0681acb49c31e80ab415" + integrity sha512-jpNffjgVKSilBCi3tNs2MEqqGdQBOo5n97B9OCfMDqO9SoiH7MyCmQ+tHCYQvY5gmD6Bf3Fas79N7Rzj6vJBsQ== + dependencies: + resolve "^1.17.0" + "@prisma/client@2.17.0": version "2.17.0" resolved "https://registry.yarnpkg.com/@prisma/client/-/client-2.17.0.tgz#e38462796c2e824504763416f5e3a7219d70652d" @@ -5634,6 +5641,11 @@ babel-plugin-syntax-jsx@6.18.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= +babel-plugin-transform-inline-environment-variables@0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-environment-variables/-/babel-plugin-transform-inline-environment-variables-0.4.3.tgz#a3b09883353be8b5e2336e3ff1ef8a5d93f9c489" + integrity sha1-o7CYgzU76LXiM24/8e+KXZP5xIk= + babel-preset-current-node-syntax@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b"