feat(blog): add file-based blog with dynamic slugs, MDX content and layout shell
- Introduced blog routing using Next.js App Router - Implemented dynamic [slug] pages for blog posts - Added MDX-based content loading via lib/posts - Integrated shared TopBar layout with navigation - Established clear content, lib and component separation
This commit is contained in:
91
apps/public-web/node_modules/next/dist/build/preview-key-utils.js
generated
vendored
Normal file
91
apps/public-web/node_modules/next/dist/build/preview-key-utils.js
generated
vendored
Normal file
@@ -0,0 +1,91 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
Object.defineProperty(exports, "generatePreviewKeys", {
|
||||
enumerable: true,
|
||||
get: function() {
|
||||
return generatePreviewKeys;
|
||||
}
|
||||
});
|
||||
const _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
||||
const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
|
||||
const _crypto = /*#__PURE__*/ _interop_require_default(require("crypto"));
|
||||
const _cachedir = require("../server/cache-dir");
|
||||
function _interop_require_default(obj) {
|
||||
return obj && obj.__esModule ? obj : {
|
||||
default: obj
|
||||
};
|
||||
}
|
||||
const CONFIG_FILE = '.previewinfo';
|
||||
const PREVIEW_ID = 'previewModeId';
|
||||
const PREVIEW_SIGNING_KEY = 'previewModeSigningKey';
|
||||
const PREVIEW_ENCRYPTION_KEY = 'previewModeEncryptionKey';
|
||||
const PREVIEW_EXPIRE_AT = 'expireAt';
|
||||
const EXPIRATION = 1000 * 60 * 60 * 24 * 14 // 14 days
|
||||
;
|
||||
async function writeCache(distDir, config) {
|
||||
const cacheBaseDir = (0, _cachedir.getStorageDirectory)(distDir);
|
||||
if (!cacheBaseDir) return;
|
||||
const configPath = _path.default.join(cacheBaseDir, CONFIG_FILE);
|
||||
if (!_fs.default.existsSync(cacheBaseDir)) {
|
||||
await _fs.default.promises.mkdir(cacheBaseDir, {
|
||||
recursive: true
|
||||
});
|
||||
}
|
||||
await _fs.default.promises.writeFile(configPath, JSON.stringify({
|
||||
[PREVIEW_ID]: config.previewModeId,
|
||||
[PREVIEW_SIGNING_KEY]: config.previewModeSigningKey,
|
||||
[PREVIEW_ENCRYPTION_KEY]: config.previewModeEncryptionKey,
|
||||
[PREVIEW_EXPIRE_AT]: Date.now() + EXPIRATION
|
||||
}));
|
||||
}
|
||||
function generateConfig() {
|
||||
return {
|
||||
previewModeId: _crypto.default.randomBytes(16).toString('hex'),
|
||||
previewModeSigningKey: _crypto.default.randomBytes(32).toString('hex'),
|
||||
previewModeEncryptionKey: _crypto.default.randomBytes(32).toString('hex')
|
||||
};
|
||||
}
|
||||
async function generatePreviewKeys({ distDir, isBuild }) {
|
||||
const cacheBaseDir = (0, _cachedir.getStorageDirectory)(distDir);
|
||||
if (!cacheBaseDir) {
|
||||
// There's no persistent storage available. We generate a new config.
|
||||
// This also covers development time.
|
||||
return generateConfig();
|
||||
}
|
||||
const configPath = _path.default.join(cacheBaseDir, CONFIG_FILE);
|
||||
async function tryReadCachedConfig() {
|
||||
if (!_fs.default.existsSync(configPath)) return false;
|
||||
try {
|
||||
const config = JSON.parse(await _fs.default.promises.readFile(configPath, 'utf8'));
|
||||
if (!config) return false;
|
||||
if (typeof config[PREVIEW_ID] !== 'string' || typeof config[PREVIEW_ENCRYPTION_KEY] !== 'string' || typeof config[PREVIEW_SIGNING_KEY] !== 'string' || typeof config[PREVIEW_EXPIRE_AT] !== 'number') {
|
||||
return false;
|
||||
}
|
||||
// For build time, we need to rotate the key if it's expired. Otherwise
|
||||
// (next start) we have to keep the key as it is so the runtime key matches
|
||||
// the build time key.
|
||||
if (isBuild && config[PREVIEW_EXPIRE_AT] < Date.now()) {
|
||||
return false;
|
||||
}
|
||||
return {
|
||||
previewModeId: config[PREVIEW_ID],
|
||||
previewModeSigningKey: config[PREVIEW_SIGNING_KEY],
|
||||
previewModeEncryptionKey: config[PREVIEW_ENCRYPTION_KEY]
|
||||
};
|
||||
} catch (e) {
|
||||
// Broken config file. We should generate a new key and overwrite it.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
const maybeValidConfig = await tryReadCachedConfig();
|
||||
if (maybeValidConfig !== false) {
|
||||
return maybeValidConfig;
|
||||
}
|
||||
const config = generateConfig();
|
||||
await writeCache(distDir, config);
|
||||
return config;
|
||||
}
|
||||
|
||||
//# sourceMappingURL=preview-key-utils.js.map
|
||||
Reference in New Issue
Block a user