- 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
172 lines
7.8 KiB
JavaScript
172 lines
7.8 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
Object.defineProperty(exports, "transpileConfig", {
|
|
enumerable: true,
|
|
get: function() {
|
|
return transpileConfig;
|
|
}
|
|
});
|
|
const _nodepath = require("node:path");
|
|
const _promises = require("node:fs/promises");
|
|
const _nodeurl = require("node:url");
|
|
const _requirehook = require("./require-hook");
|
|
const _log = require("../output/log");
|
|
const _installdependencies = require("../../lib/install-dependencies");
|
|
const _utils = require("../../server/lib/utils");
|
|
function resolveSWCOptions(cwd, compilerOptions) {
|
|
var _process_versions, _process;
|
|
return {
|
|
jsc: {
|
|
parser: {
|
|
syntax: 'typescript'
|
|
},
|
|
...compilerOptions.paths ? {
|
|
paths: compilerOptions.paths
|
|
} : {},
|
|
...compilerOptions.baseUrl ? {
|
|
baseUrl: (0, _nodepath.resolve)(cwd, compilerOptions.baseUrl)
|
|
} : compilerOptions.paths ? {
|
|
baseUrl: cwd
|
|
} : {}
|
|
},
|
|
module: {
|
|
type: 'commonjs'
|
|
},
|
|
isModule: 'unknown',
|
|
env: {
|
|
targets: {
|
|
// Setting the Node.js version can reduce unnecessary code generation.
|
|
node: ((_process = process) == null ? void 0 : (_process_versions = _process.versions) == null ? void 0 : _process_versions.node) ?? '20.19.0'
|
|
}
|
|
}
|
|
};
|
|
}
|
|
// Ported from next/src/lib/verify-typescript-setup.ts
|
|
// Although this overlaps with the later `verifyTypeScriptSetup`,
|
|
// it is acceptable since the time difference in the worst case is trivial,
|
|
// as we are only preparing to install the dependencies once more.
|
|
async function verifyTypeScriptSetup(cwd, configFileName) {
|
|
try {
|
|
// Quick module check.
|
|
require.resolve('typescript', {
|
|
paths: [
|
|
cwd
|
|
]
|
|
});
|
|
} catch (error) {
|
|
if (error && typeof error === 'object' && 'code' in error && error.code === 'MODULE_NOT_FOUND') {
|
|
(0, _log.warn)(`Installing TypeScript as it was not found while loading "${configFileName}".`);
|
|
await (0, _installdependencies.installDependencies)(cwd, [
|
|
{
|
|
pkg: 'typescript'
|
|
}
|
|
], true).catch((err)=>{
|
|
if (err && typeof err === 'object' && 'command' in err) {
|
|
console.error(`Failed to install TypeScript, please install it manually to continue:\n` + err.command + '\n');
|
|
}
|
|
throw err;
|
|
});
|
|
}
|
|
}
|
|
}
|
|
async function getTsConfig(cwd) {
|
|
const ts = require(require.resolve('typescript', {
|
|
paths: [
|
|
cwd
|
|
]
|
|
}));
|
|
// NOTE: This doesn't fully cover the edge case for setting
|
|
// "typescript.tsconfigPath" in next config which is currently
|
|
// a restriction.
|
|
const tsConfigPath = ts.findConfigFile(cwd, ts.sys.fileExists, 'tsconfig.json');
|
|
if (!tsConfigPath) {
|
|
// It is ok to not return ts.getDefaultCompilerOptions() because
|
|
// we are only looking for paths and baseUrl from tsConfig.
|
|
return {};
|
|
}
|
|
const configFile = ts.readConfigFile(tsConfigPath, ts.sys.readFile);
|
|
const parsedCommandLine = ts.parseJsonConfigFileContent(configFile.config, ts.sys, cwd);
|
|
return parsedCommandLine.options;
|
|
}
|
|
async function transpileConfig({ nextConfigPath, configFileName, cwd }) {
|
|
try {
|
|
// envs are passed to the workers and preserve the flag
|
|
if (process.env.__NEXT_NODE_NATIVE_TS_LOADER_ENABLED === 'true') {
|
|
try {
|
|
// Node.js v22.10.0+
|
|
// Value is 'strip' or 'transform' based on how the feature is enabled.
|
|
// https://nodejs.org/api/process.html#processfeaturestypescript
|
|
// TODO: Remove `as any` once we bump @types/node to v22.10.0+
|
|
if (process.features.typescript) {
|
|
// Run import() here to catch errors and fallback to legacy resolution.
|
|
return (await import((0, _nodeurl.pathToFileURL)(nextConfigPath).href)).default;
|
|
}
|
|
if ((0, _utils.getNodeOptionsArgs)().includes('--no-experimental-strip-types') || process.execArgv.includes('--no-experimental-strip-types')) {
|
|
(0, _log.warnOnce)(`Skipped resolving "${configFileName}" using Node.js native TypeScript resolution because it was disabled by the "--no-experimental-strip-types" flag.` + ' Falling back to legacy resolution.' + ' Learn more: https://nextjs.org/docs/app/api-reference/config/typescript#using-nodejs-native-typescript-resolver-for-nextconfigts');
|
|
}
|
|
// Feature is not enabled, fallback to legacy resolution for current session.
|
|
process.env.__NEXT_NODE_NATIVE_TS_LOADER_ENABLED = 'false';
|
|
} catch (cause) {
|
|
(0, _log.warnOnce)(`Failed to import "${configFileName}" using Node.js native TypeScript resolution.` + ' Falling back to legacy resolution.' + ' Learn more: https://nextjs.org/docs/app/api-reference/config/typescript#using-nodejs-native-typescript-resolver-for-nextconfigts', {
|
|
cause
|
|
});
|
|
// Once failed, fallback to legacy resolution for current session.
|
|
process.env.__NEXT_NODE_NATIVE_TS_LOADER_ENABLED = 'false';
|
|
}
|
|
}
|
|
// Ensure TypeScript is installed to use the API.
|
|
await verifyTypeScriptSetup(cwd, configFileName);
|
|
const compilerOptions = await getTsConfig(cwd);
|
|
return handleCJS({
|
|
cwd,
|
|
nextConfigPath,
|
|
compilerOptions
|
|
});
|
|
} catch (cause) {
|
|
throw Object.defineProperty(new Error(`Failed to transpile "${configFileName}".`, {
|
|
cause
|
|
}), "__NEXT_ERROR_CODE", {
|
|
value: "E797",
|
|
enumerable: false,
|
|
configurable: true
|
|
});
|
|
}
|
|
}
|
|
async function handleCJS({ cwd, nextConfigPath, compilerOptions }) {
|
|
const swcOptions = resolveSWCOptions(cwd, compilerOptions);
|
|
let hasRequire = false;
|
|
try {
|
|
var _config_experimental;
|
|
const nextConfigString = await (0, _promises.readFile)(nextConfigPath, 'utf8');
|
|
// lazy require swc since it loads React before even setting NODE_ENV
|
|
// resulting loading Development React on Production
|
|
const { loadBindings } = require('../swc');
|
|
const bindings = await loadBindings();
|
|
const { code } = await bindings.transform(nextConfigString, swcOptions);
|
|
// register require hook only if require exists
|
|
if (code.includes('require(')) {
|
|
(0, _requirehook.registerHook)(swcOptions);
|
|
hasRequire = true;
|
|
}
|
|
// filename & extension don't matter here
|
|
const config = (0, _requirehook.requireFromString)(code, (0, _nodepath.resolve)(cwd, 'next.config.compiled.js'));
|
|
// At this point we have already loaded the bindings without this configuration setting due to the `transform` call above.
|
|
// Possibly we fell back to wasm in which case, it all works out but if not we need to warn
|
|
// that the configuration was ignored.
|
|
if ((config == null ? void 0 : (_config_experimental = config.experimental) == null ? void 0 : _config_experimental.useWasmBinary) && !bindings.isWasm) {
|
|
(0, _log.warn)('Using a next.config.ts file is incompatible with `experimental.useWasmBinary` unless ' + '`--experimental-next-config-strip-types` is also passed.\nSetting `useWasmBinary` to `false');
|
|
config.experimental.useWasmBinary = false;
|
|
}
|
|
return config;
|
|
} catch (error) {
|
|
throw error;
|
|
} finally{
|
|
if (hasRequire) {
|
|
(0, _requirehook.deregisterHook)();
|
|
}
|
|
}
|
|
}
|
|
|
|
//# sourceMappingURL=transpile-config.js.map
|