@blinkk/root 4.0.0-alpha.3 → 4.0.0-alpha.5
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/dist/{chunk-TM6QRBGS.js → chunk-2GKECTUL.js} +5 -1
- package/dist/chunk-2GKECTUL.js.map +7 -0
- package/dist/{chunk-AQWGKLSN.js → chunk-HUACTUZ3.js} +8 -2
- package/dist/chunk-HUACTUZ3.js.map +7 -0
- package/dist/cli.js +2 -2
- package/dist/core/config.d.ts +10 -1
- package/dist/core.js.map +2 -2
- package/dist/functions.js +2 -2
- package/dist/middleware.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-AQWGKLSN.js.map +0 -7
- package/dist/chunk-TM6QRBGS.js.map +0 -7
|
@@ -57,6 +57,10 @@ function trailingSlashMiddleware(options) {
|
|
|
57
57
|
};
|
|
58
58
|
}
|
|
59
59
|
function redirectWithQuery(req, res, redirectCode, redirectPath) {
|
|
60
|
+
res.setHeader(
|
|
61
|
+
"cache-control",
|
|
62
|
+
"no-cache, no-store, max-age=0, must-revalidate"
|
|
63
|
+
);
|
|
60
64
|
const queryStr = getQueryStr(req);
|
|
61
65
|
const redirectUrl = queryStr ? `${redirectPath}?${queryStr}` : redirectPath;
|
|
62
66
|
res.redirect(redirectCode, redirectUrl);
|
|
@@ -249,4 +253,4 @@ export {
|
|
|
249
253
|
sessionMiddleware,
|
|
250
254
|
Session
|
|
251
255
|
};
|
|
252
|
-
//# sourceMappingURL=chunk-
|
|
256
|
+
//# sourceMappingURL=chunk-2GKECTUL.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/middleware/common.ts", "../src/middleware/compression.ts", "../src/middleware/multipart.ts", "../src/middleware/session.ts"],
|
|
4
|
+
"sourcesContent": ["import path from 'node:path';\nimport micromatch from 'micromatch';\nimport {RootConfig} from '../core/config.js';\nimport {getSecurityConfig, setSecurityHeaders} from '../core/security.js';\nimport {Request, Response, NextFunction} from '../core/types.js';\n\n/**\n * Middleware that injects the root.js project config into the request context.\n */\nexport function rootProjectMiddleware(options: {rootConfig: RootConfig}) {\n return (req: Request, _: Response, next: NextFunction) => {\n req.rootConfig = options.rootConfig;\n next();\n };\n}\n\n/**\n * Middleware that sets security-related HTTP headers (e.g.\n * `Strict-Transport-Security`) on all responses using the `server.security`\n * config in root.config.ts.\n *\n * The renderer sets these headers on rendered HTML responses, but responses\n * that bypass the renderer (e.g. redirects, static files, plugin-served\n * responses, 404s) would otherwise be served without them. Per\n * https://hstspreload.org, HSTS preload eligibility requires the HSTS header\n * on redirects as well.\n *\n * NOTE: `Content-Security-Policy` is excluded here since the CSP is\n * document-specific and depends on a per-request nonce, which is generated by\n * the renderer at render time.\n */\nexport function securityHeadersMiddleware(options: {rootConfig: RootConfig}) {\n const securityConfig = {\n ...getSecurityConfig(options.rootConfig),\n contentSecurityPolicy: false as const,\n };\n return (req: Request, res: Response, next: NextFunction) => {\n setSecurityHeaders(res, {securityConfig});\n next();\n };\n}\n\n/**\n * Middleware that injects HTTP headers from the `server.headers` config in\n * root.config.ts.\n */\nexport function headersMiddleware(options: {rootConfig: RootConfig}) {\n const headersUserConfig = options.rootConfig.server?.headers || [];\n // Filter header config values that are invalid.\n const headersConfig = headersUserConfig.filter((headerConfig) => {\n return (\n headerConfig.source &&\n headerConfig.headers &&\n headerConfig.headers.length > 0\n );\n });\n return (req: Request, res: Response, next: NextFunction) => {\n headersConfig.forEach((headerConfig) => {\n if (micromatch.isMatch(req.path, headerConfig.source)) {\n headerConfig.headers.forEach((header) => {\n if (header.key) {\n res.setHeader(String(header.key), String(header.value));\n }\n });\n }\n });\n next();\n };\n}\n\n/**\n * Trailing slash middleware. Handles trailing slash redirects (preserving any\n * query params) using the `server.trailingSlash` config in root.config.ts.\n */\nexport function trailingSlashMiddleware(options: {rootConfig: RootConfig}) {\n const trailingSlash = options.rootConfig.server?.trailingSlash;\n\n return (req: Request, res: Response, next: NextFunction) => {\n // If `trailingSlash: false`, force a trailing slash in the URL.\n if (\n trailingSlash === true &&\n !path.extname(req.path) &&\n !req.path.endsWith('/')\n ) {\n const redirectPath = `${req.path}/`;\n redirectWithQuery(req, res, 301, redirectPath);\n return;\n }\n\n // If `trailingSlash: false`, remove any trailing slash from the URL.\n if (\n trailingSlash === false &&\n !path.extname(req.path) &&\n req.path !== '/' &&\n req.path.endsWith('/')\n ) {\n const redirectPath = removeTrailingSlashes(req.path);\n redirectWithQuery(req, res, 301, redirectPath);\n return;\n }\n\n next();\n };\n}\n\n/**\n * Issues an HTTP redirect, preserving any query params from the original req.\n * Redirects are never cached (even 301s), so config changes take effect\n * immediately for browsers and CDNs.\n */\nfunction redirectWithQuery(\n req: Request,\n res: Response,\n redirectCode: number,\n redirectPath: string\n) {\n res.setHeader(\n 'cache-control',\n 'no-cache, no-store, max-age=0, must-revalidate'\n );\n const queryStr = getQueryStr(req);\n const redirectUrl = queryStr ? `${redirectPath}?${queryStr}` : redirectPath;\n res.redirect(redirectCode, redirectUrl);\n}\n\n/**\n * Returns the query string for a request, or empty string if no query.\n */\nfunction getQueryStr(req: Request): string {\n const qIndex = req.originalUrl.indexOf('?');\n if (qIndex === -1) {\n return '';\n }\n return req.originalUrl.slice(qIndex + 1);\n}\n\n/**\n * Removes trailing slashes from a URL path.\n * Note: A path with only slashes (e.g. `///`) returns `/`.\n */\nfunction removeTrailingSlashes(urlPath: string) {\n while (urlPath.endsWith('/') && urlPath !== '/') {\n urlPath = urlPath.slice(0, -1);\n }\n return urlPath;\n}\n", "import zlib from 'node:zlib';\n\nimport compression from 'compression';\n\nimport {Request, Response, NextFunction} from '../core/types.js';\n\n/**\n * Response compression middleware shared by the preview and prod servers.\n *\n * Uses brotli when the client accepts it (`Accept-Encoding: br`), falling\n * back to gzip. Brotli quality 4 is used as a balance between compression\n * ratio and CPU cost for dynamically-rendered responses \u2014 it generally\n * compresses better than gzip's default (level 6) at comparable speed.\n * Pre-compressed static assets should still be served with higher quality\n * settings by a CDN or static file server where possible.\n */\nexport function compressionMiddleware(): (\n req: Request,\n res: Response,\n next: NextFunction\n) => void {\n return compression({\n brotli: {\n params: {\n [zlib.constants.BROTLI_PARAM_QUALITY]: 4,\n },\n },\n }) as (req: Request, res: Response, next: NextFunction) => void;\n}\n", "import busboy from 'busboy';\nimport {RequestHandler} from 'express';\nimport {Request, Response, NextFunction, MultipartFile} from '../core/types.js';\n\nconst DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB\n\n/**\n * Middleware for parsing multipart file uploads that's compatible with the dev\n * server and Firebase Functions.\n *\n * Context:\n * https://stackoverflow.com/questions/47242340/how-to-perform-an-http-file-upload-using-express-on-cloud-functions-for-firebase\n */\nexport function multipartMiddleware(options?: {\n maxFileSize?: number;\n}): RequestHandler {\n const maxFileSize = options?.maxFileSize || DEFAULT_MAX_FILE_SIZE;\n const handler: any = (req: Request, res: Response, next: NextFunction) => {\n const contentType = String(req.headers['content-type'] || '');\n if (\n req.method === 'POST' &&\n contentType.startsWith('multipart/form-data')\n ) {\n const parser = busboy({headers: req.headers});\n\n // Data storage for fields and files\n const fields: {[fieldname: string]: string} = {};\n const files: {[name: string]: MultipartFile} = {};\n\n // Handle field data.\n parser.on('field', (fieldname: string, val: any) => {\n fields[fieldname] = val;\n });\n\n // Handle file data. Files are saved to an in-memory buffer.\n parser.on(\n 'file',\n (\n fieldname: string,\n file: any,\n meta: {\n filename: string;\n encoding: string;\n mimeType: string;\n }\n ) => {\n const {filename, encoding, mimeType: mimetype} = meta;\n const fileChunks: Uint8Array[] = [];\n let totalBytesRead = 0;\n\n file.on('data', (chunk: Uint8Array) => {\n totalBytesRead += chunk.length;\n\n if (totalBytesRead > maxFileSize) {\n // File size exceeds the limit, stop reading.\n console.error(`File size exceeds the limit: ${fieldname}.`);\n file.removeAllListeners('data');\n // Consume and discard remaining data.\n file.resume();\n } else {\n fileChunks.push(chunk);\n }\n });\n\n file.on('end', () => {\n if (totalBytesRead <= maxFileSize) {\n const buffer = Buffer.concat(fileChunks);\n\n files[fieldname] = {\n fieldname,\n buffer,\n originalName: filename,\n encoding,\n mimetype,\n };\n }\n });\n }\n );\n\n // Update `req.body` and `req.files`.\n parser.on('finish', () => {\n req.body = fields;\n req.files = files;\n next();\n });\n\n // Pipe the request to Busboy. On Firebase Functions, `rawBody` contains\n // the multipart request. Otherwise the express request can be piped to\n // the Busboy parser.\n if (req.rawBody) {\n parser.end(req.rawBody);\n } else {\n req.pipe(parser);\n }\n } else {\n next();\n }\n };\n return handler;\n}\n", "import {NextFunction, Request, Response} from '../core/types.js';\n\nexport const SESSION_COOKIE = '__session';\nlet hasWarnedMissingSessionCookieSecret = false;\n\n// 5 days.\nconst DEFAULT_MAX_AGE = 60 * 60 * 24 * 5 * 1000;\n\nexport interface SessionMiddlewareOptions {\n maxAge?: number;\n}\n\nexport interface SaveSessionOptions {\n sameSite?: 'strict' | 'lax' | 'none';\n}\n\n/**\n * Middleware for storing session data stored in an http cookie called\n * `__session`. This cookie is compatible with Firebase Hosting:\n * https://firebase.google.com/docs/hosting/manage-cache#using_cookies\n */\nexport function sessionMiddleware(options?: SessionMiddlewareOptions) {\n const maxAge = options?.maxAge || DEFAULT_MAX_AGE;\n return (req: Request, res: Response, next: NextFunction) => {\n const cookieValue = String(req.signedCookies[SESSION_COOKIE] || '');\n const session = Session.fromCookieValue(cookieValue);\n req.session = session;\n res.session = session;\n res.saveSession = (saveSessionOptions?: SaveSessionOptions) => {\n if (!session.hasChanges) {\n return;\n }\n\n const hasConfiguredSessionSecret = Boolean(\n req.rootConfig?.server?.sessionCookieSecret\n );\n if (!hasConfiguredSessionSecret && !hasWarnedMissingSessionCookieSecret) {\n console.warn(\n 'session cookie is being set without a configured server.sessionCookieSecret; sessions may be invalidated across server restarts'\n );\n hasWarnedMissingSessionCookieSecret = true;\n }\n\n // \"secure\" cookies require https, so disable \"secure\" when in development.\n const secureCookie = Boolean(process.env.NODE_ENV !== 'development');\n const cookieValue = session.toString();\n let sameSite = saveSessionOptions?.sameSite;\n if (!sameSite) {\n // Default the sameSite setting to \"none\", which allows it to be used in\n // multi-site contexts.\n // \"Cookies with SameSite=None must also specify Secure, meaning they require a secure context.\"\n // https://web.dev/articles/samesite-cookies-explained#samesite_cookie_recipes\n sameSite = secureCookie ? 'none' : 'strict';\n }\n res.cookie(SESSION_COOKIE, cookieValue, {\n maxAge: maxAge,\n httpOnly: true,\n secure: secureCookie,\n signed: true,\n sameSite: sameSite,\n });\n };\n req.hooks.add('preRender', () => {\n res.saveSession();\n });\n next();\n };\n}\n\nexport class Session {\n private data: Record<string, string> = {};\n hasChanges = false;\n\n constructor(data?: Record<string, string>) {\n this.data = data || {};\n }\n\n static fromCookieValue(cookieValue: string) {\n const data: Record<string, string> = {};\n if (cookieValue.startsWith('b64:')) {\n try {\n const encodedStr = cookieValue.slice(4);\n const params = new URLSearchParams(base64Decode(encodedStr));\n for (const [key, value] of params.entries()) {\n data[key] = value;\n }\n } catch (err) {\n console.warn('failed to parse session cookie:', err);\n return new Session();\n }\n }\n return new Session(data);\n }\n\n getItem(key: string): string | null {\n return this.data[key] ?? null;\n }\n\n setItem(key: string, value: string) {\n this.data[key] = value;\n this.hasChanges = true;\n }\n\n removeItem(key: string) {\n delete this.data[key];\n this.hasChanges = true;\n }\n\n toString(): string {\n const params = new URLSearchParams(this.data);\n return `b64:${base64Encode(params.toString())}`;\n }\n}\n\nfunction base64Encode(str: string): string {\n return Buffer.from(str, 'utf-8').toString('base64');\n}\n\nfunction base64Decode(str: string): string {\n return Buffer.from(str, 'base64').toString('utf-8');\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;AAAA,OAAO,UAAU;AACjB,OAAO,gBAAgB;AAQhB,SAAS,sBAAsB,SAAmC;AACvE,SAAO,CAAC,KAAc,GAAa,SAAuB;AACxD,QAAI,aAAa,QAAQ;AACzB,SAAK;AAAA,EACP;AACF;AAiBO,SAAS,0BAA0B,SAAmC;AAC3E,QAAM,iBAAiB;AAAA,IACrB,GAAG,kBAAkB,QAAQ,UAAU;AAAA,IACvC,uBAAuB;AAAA,EACzB;AACA,SAAO,CAAC,KAAc,KAAe,SAAuB;AAC1D,uBAAmB,KAAK,EAAC,eAAc,CAAC;AACxC,SAAK;AAAA,EACP;AACF;AAMO,SAAS,kBAAkB,SAAmC;AACnE,QAAM,oBAAoB,QAAQ,WAAW,QAAQ,WAAW,CAAC;AAEjE,QAAM,gBAAgB,kBAAkB,OAAO,CAAC,iBAAiB;AAC/D,WACE,aAAa,UACb,aAAa,WACb,aAAa,QAAQ,SAAS;AAAA,EAElC,CAAC;AACD,SAAO,CAAC,KAAc,KAAe,SAAuB;AAC1D,kBAAc,QAAQ,CAAC,iBAAiB;AACtC,UAAI,WAAW,QAAQ,IAAI,MAAM,aAAa,MAAM,GAAG;AACrD,qBAAa,QAAQ,QAAQ,CAAC,WAAW;AACvC,cAAI,OAAO,KAAK;AACd,gBAAI,UAAU,OAAO,OAAO,GAAG,GAAG,OAAO,OAAO,KAAK,CAAC;AAAA,UACxD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AACD,SAAK;AAAA,EACP;AACF;AAMO,SAAS,wBAAwB,SAAmC;AACzE,QAAM,gBAAgB,QAAQ,WAAW,QAAQ;AAEjD,SAAO,CAAC,KAAc,KAAe,SAAuB;AAE1D,QACE,kBAAkB,QAClB,CAAC,KAAK,QAAQ,IAAI,IAAI,KACtB,CAAC,IAAI,KAAK,SAAS,GAAG,GACtB;AACA,YAAM,eAAe,GAAG,IAAI,IAAI;AAChC,wBAAkB,KAAK,KAAK,KAAK,YAAY;AAC7C;AAAA,IACF;AAGA,QACE,kBAAkB,SAClB,CAAC,KAAK,QAAQ,IAAI,IAAI,KACtB,IAAI,SAAS,OACb,IAAI,KAAK,SAAS,GAAG,GACrB;AACA,YAAM,eAAe,sBAAsB,IAAI,IAAI;AACnD,wBAAkB,KAAK,KAAK,KAAK,YAAY;AAC7C;AAAA,IACF;AAEA,SAAK;AAAA,EACP;AACF;AAOA,SAAS,kBACP,KACA,KACA,cACA,cACA;AACA,MAAI;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACA,QAAM,WAAW,YAAY,GAAG;AAChC,QAAM,cAAc,WAAW,GAAG,YAAY,IAAI,QAAQ,KAAK;AAC/D,MAAI,SAAS,cAAc,WAAW;AACxC;AAKA,SAAS,YAAY,KAAsB;AACzC,QAAM,SAAS,IAAI,YAAY,QAAQ,GAAG;AAC1C,MAAI,WAAW,IAAI;AACjB,WAAO;AAAA,EACT;AACA,SAAO,IAAI,YAAY,MAAM,SAAS,CAAC;AACzC;AAMA,SAAS,sBAAsB,SAAiB;AAC9C,SAAO,QAAQ,SAAS,GAAG,KAAK,YAAY,KAAK;AAC/C,cAAU,QAAQ,MAAM,GAAG,EAAE;AAAA,EAC/B;AACA,SAAO;AACT;;;ACjJA,OAAO,UAAU;AAEjB,OAAO,iBAAiB;AAcjB,SAAS,wBAIN;AACR,SAAO,YAAY;AAAA,IACjB,QAAQ;AAAA,MACN,QAAQ;AAAA,QACN,CAAC,KAAK,UAAU,oBAAoB,GAAG;AAAA,MACzC;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AC5BA,OAAO,YAAY;AAInB,IAAM,wBAAwB,KAAK,OAAO;AASnC,SAAS,oBAAoB,SAEjB;AACjB,QAAM,cAAc,SAAS,eAAe;AAC5C,QAAM,UAAe,CAAC,KAAc,KAAe,SAAuB;AACxE,UAAM,cAAc,OAAO,IAAI,QAAQ,cAAc,KAAK,EAAE;AAC5D,QACE,IAAI,WAAW,UACf,YAAY,WAAW,qBAAqB,GAC5C;AACA,YAAM,SAAS,OAAO,EAAC,SAAS,IAAI,QAAO,CAAC;AAG5C,YAAM,SAAwC,CAAC;AAC/C,YAAM,QAAyC,CAAC;AAGhD,aAAO,GAAG,SAAS,CAAC,WAAmB,QAAa;AAClD,eAAO,SAAS,IAAI;AAAA,MACtB,CAAC;AAGD,aAAO;AAAA,QACL;AAAA,QACA,CACE,WACA,MACA,SAKG;AACH,gBAAM,EAAC,UAAU,UAAU,UAAU,SAAQ,IAAI;AACjD,gBAAM,aAA2B,CAAC;AAClC,cAAI,iBAAiB;AAErB,eAAK,GAAG,QAAQ,CAAC,UAAsB;AACrC,8BAAkB,MAAM;AAExB,gBAAI,iBAAiB,aAAa;AAEhC,sBAAQ,MAAM,gCAAgC,SAAS,GAAG;AAC1D,mBAAK,mBAAmB,MAAM;AAE9B,mBAAK,OAAO;AAAA,YACd,OAAO;AACL,yBAAW,KAAK,KAAK;AAAA,YACvB;AAAA,UACF,CAAC;AAED,eAAK,GAAG,OAAO,MAAM;AACnB,gBAAI,kBAAkB,aAAa;AACjC,oBAAM,SAAS,OAAO,OAAO,UAAU;AAEvC,oBAAM,SAAS,IAAI;AAAA,gBACjB;AAAA,gBACA;AAAA,gBACA,cAAc;AAAA,gBACd;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAGA,aAAO,GAAG,UAAU,MAAM;AACxB,YAAI,OAAO;AACX,YAAI,QAAQ;AACZ,aAAK;AAAA,MACP,CAAC;AAKD,UAAI,IAAI,SAAS;AACf,eAAO,IAAI,IAAI,OAAO;AAAA,MACxB,OAAO;AACL,YAAI,KAAK,MAAM;AAAA,MACjB;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AAAA,EACF;AACA,SAAO;AACT;;;AClGO,IAAM,iBAAiB;AAC9B,IAAI,sCAAsC;AAG1C,IAAM,kBAAkB,KAAK,KAAK,KAAK,IAAI;AAepC,SAAS,kBAAkB,SAAoC;AACpE,QAAM,SAAS,SAAS,UAAU;AAClC,SAAO,CAAC,KAAc,KAAe,SAAuB;AAC1D,UAAM,cAAc,OAAO,IAAI,cAAc,cAAc,KAAK,EAAE;AAClE,UAAM,UAAU,QAAQ,gBAAgB,WAAW;AACnD,QAAI,UAAU;AACd,QAAI,UAAU;AACd,QAAI,cAAc,CAAC,uBAA4C;AAC7D,UAAI,CAAC,QAAQ,YAAY;AACvB;AAAA,MACF;AAEA,YAAM,6BAA6B;AAAA,QACjC,IAAI,YAAY,QAAQ;AAAA,MAC1B;AACA,UAAI,CAAC,8BAA8B,CAAC,qCAAqC;AACvE,gBAAQ;AAAA,UACN;AAAA,QACF;AACA,8CAAsC;AAAA,MACxC;AAGA,YAAM,eAAe,QAAQ,QAAQ,IAAI,aAAa,aAAa;AACnE,YAAMA,eAAc,QAAQ,SAAS;AACrC,UAAI,WAAW,oBAAoB;AACnC,UAAI,CAAC,UAAU;AAKb,mBAAW,eAAe,SAAS;AAAA,MACrC;AACA,UAAI,OAAO,gBAAgBA,cAAa;AAAA,QACtC;AAAA,QACA,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,MAAM,IAAI,aAAa,MAAM;AAC/B,UAAI,YAAY;AAAA,IAClB,CAAC;AACD,SAAK;AAAA,EACP;AACF;AAEO,IAAM,UAAN,MAAM,SAAQ;AAAA,EACX,OAA+B,CAAC;AAAA,EACxC,aAAa;AAAA,EAEb,YAAY,MAA+B;AACzC,SAAK,OAAO,QAAQ,CAAC;AAAA,EACvB;AAAA,EAEA,OAAO,gBAAgB,aAAqB;AAC1C,UAAM,OAA+B,CAAC;AACtC,QAAI,YAAY,WAAW,MAAM,GAAG;AAClC,UAAI;AACF,cAAM,aAAa,YAAY,MAAM,CAAC;AACtC,cAAM,SAAS,IAAI,gBAAgB,aAAa,UAAU,CAAC;AAC3D,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG;AAC3C,eAAK,GAAG,IAAI;AAAA,QACd;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,KAAK,mCAAmC,GAAG;AACnD,eAAO,IAAI,SAAQ;AAAA,MACrB;AAAA,IACF;AACA,WAAO,IAAI,SAAQ,IAAI;AAAA,EACzB;AAAA,EAEA,QAAQ,KAA4B;AAClC,WAAO,KAAK,KAAK,GAAG,KAAK;AAAA,EAC3B;AAAA,EAEA,QAAQ,KAAa,OAAe;AAClC,SAAK,KAAK,GAAG,IAAI;AACjB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,WAAW,KAAa;AACtB,WAAO,KAAK,KAAK,GAAG;AACpB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,WAAmB;AACjB,UAAM,SAAS,IAAI,gBAAgB,KAAK,IAAI;AAC5C,WAAO,OAAO,aAAa,OAAO,SAAS,CAAC,CAAC;AAAA,EAC/C;AACF;AAEA,SAAS,aAAa,KAAqB;AACzC,SAAO,OAAO,KAAK,KAAK,OAAO,EAAE,SAAS,QAAQ;AACpD;AAEA,SAAS,aAAa,KAAqB;AACzC,SAAO,OAAO,KAAK,KAAK,QAAQ,EAAE,SAAS,OAAO;AACpD;",
|
|
6
|
+
"names": ["cookieValue"]
|
|
7
|
+
}
|
|
@@ -43,7 +43,7 @@ import {
|
|
|
43
43
|
securityHeadersMiddleware,
|
|
44
44
|
sessionMiddleware,
|
|
45
45
|
trailingSlashMiddleware
|
|
46
|
-
} from "./chunk-
|
|
46
|
+
} from "./chunk-2GKECTUL.js";
|
|
47
47
|
|
|
48
48
|
// src/cli/cli.ts
|
|
49
49
|
import { Command, InvalidArgumentError, Option } from "commander";
|
|
@@ -911,6 +911,9 @@ async function build(rootProjectDir, options) {
|
|
|
911
911
|
` ${dim3(`threads: ${threadsDesc} (${resolvedThreads.source})`)}`
|
|
912
912
|
);
|
|
913
913
|
}
|
|
914
|
+
const buildCacheDir = path2.join(distDir, ".cache");
|
|
915
|
+
await rmDir(buildCacheDir);
|
|
916
|
+
process.env.ROOT_BUILD_CACHE_DIR = buildCacheDir;
|
|
914
917
|
const progress = new BuildProgress({
|
|
915
918
|
total: sitemapEntries.length,
|
|
916
919
|
mode: activeLogMode,
|
|
@@ -987,6 +990,9 @@ async function build(rootProjectDir, options) {
|
|
|
987
990
|
} catch (e) {
|
|
988
991
|
progress.abort();
|
|
989
992
|
throw e;
|
|
993
|
+
} finally {
|
|
994
|
+
delete process.env.ROOT_BUILD_CACHE_DIR;
|
|
995
|
+
await rmDir(buildCacheDir);
|
|
990
996
|
}
|
|
991
997
|
progress.finish();
|
|
992
998
|
if (rootConfig.sitemap) {
|
|
@@ -3799,4 +3805,4 @@ export {
|
|
|
3799
3805
|
createProdServer,
|
|
3800
3806
|
CliRunner
|
|
3801
3807
|
};
|
|
3802
|
-
//# sourceMappingURL=chunk-
|
|
3808
|
+
//# sourceMappingURL=chunk-HUACTUZ3.js.map
|