next
Version:
The React Framework
210 lines (209 loc) • 8.13 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getRequiredConfiguration = getRequiredConfiguration;
exports.writeConfigurationDefaults = writeConfigurationDefaults;
var _fs = require("fs");
var _chalk = _interopRequireDefault(require("chalk"));
var CommentJson = _interopRequireWildcard(require("next/dist/compiled/comment-json"));
var _semver = _interopRequireDefault(require("next/dist/compiled/semver"));
var _os = _interopRequireDefault(require("os"));
var _getTypeScriptConfiguration = require("./getTypeScriptConfiguration");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _interopRequireWildcard(obj) {
if (obj && obj.__esModule) {
return obj;
} else {
var newObj = {
};
if (obj != null) {
for(var key in obj){
if (Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {
};
if (desc.get || desc.set) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
}
newObj.default = obj;
return newObj;
}
}
function getDesiredCompilerOptions(ts) {
const o = {
// These are suggested values and will be set when not present in the
// tsconfig.json
target: {
suggested: 'es5'
},
lib: {
suggested: [
'dom',
'dom.iterable',
'esnext'
]
},
allowJs: {
suggested: true
},
skipLibCheck: {
suggested: true
},
strict: {
suggested: false
},
forceConsistentCasingInFileNames: {
suggested: true
},
noEmit: {
suggested: true
},
..._semver.default.gte(ts.version, '4.4.2') ? {
incremental: {
suggested: true
}
} : undefined,
// These values are required and cannot be changed by the user
// Keep this in sync with the webpack config
// 'parsedValue' matches the output value from ts.parseJsonConfigFileContent()
esModuleInterop: {
value: true,
reason: 'requirement for babel'
},
module: {
parsedValue: ts.ModuleKind.ESNext,
// All of these values work:
parsedValues: [
ts.ModuleKind.ES2020,
ts.ModuleKind.ESNext,
ts.ModuleKind.CommonJS,
ts.ModuleKind.AMD,
],
value: 'esnext',
reason: 'for dynamic import() support'
},
moduleResolution: {
parsedValue: ts.ModuleResolutionKind.NodeJs,
value: 'node',
reason: 'to match webpack resolution'
},
resolveJsonModule: {
value: true,
reason: 'to match webpack resolution'
},
isolatedModules: {
value: true,
reason: 'requirement for babel'
},
jsx: {
parsedValue: ts.JsxEmit.Preserve,
value: 'preserve',
reason: 'next.js implements its own optimized jsx transform'
}
};
return o;
}
function getRequiredConfiguration(ts) {
const res = {
};
const desiredCompilerOptions = getDesiredCompilerOptions(ts);
for (const optionKey of Object.keys(desiredCompilerOptions)){
const ev = desiredCompilerOptions[optionKey];
if (!('value' in ev)) {
continue;
}
var _parsedValue;
res[optionKey] = (_parsedValue = ev.parsedValue) !== null && _parsedValue !== void 0 ? _parsedValue : ev.value;
}
return res;
}
async function writeConfigurationDefaults(ts, tsConfigPath, isFirstTimeSetup) {
if (isFirstTimeSetup) {
await _fs.promises.writeFile(tsConfigPath, '{}' + _os.default.EOL);
}
const desiredCompilerOptions = getDesiredCompilerOptions(ts);
const { options: tsOptions , raw: rawConfig } = await (0, _getTypeScriptConfiguration).getTypeScriptConfiguration(ts, tsConfigPath, true);
const userTsConfigContent = await _fs.promises.readFile(tsConfigPath, {
encoding: 'utf8'
});
const userTsConfig = CommentJson.parse(userTsConfigContent);
if (userTsConfig.compilerOptions == null && !('extends' in rawConfig)) {
userTsConfig.compilerOptions = {
};
isFirstTimeSetup = true;
}
const suggestedActions = [];
const requiredActions = [];
for (const optionKey of Object.keys(desiredCompilerOptions)){
const check = desiredCompilerOptions[optionKey];
if ('suggested' in check) {
if (!(optionKey in tsOptions)) {
if (!userTsConfig.compilerOptions) {
userTsConfig.compilerOptions = {
};
}
userTsConfig.compilerOptions[optionKey] = check.suggested;
suggestedActions.push(_chalk.default.cyan(optionKey) + ' was set to ' + _chalk.default.bold(check.suggested));
}
} else if ('value' in check) {
var ref;
const ev = tsOptions[optionKey];
if (!('parsedValues' in check ? (ref = check.parsedValues) === null || ref === void 0 ? void 0 : ref.includes(ev) : 'parsedValue' in check ? check.parsedValue === ev : check.value === ev)) {
if (!userTsConfig.compilerOptions) {
userTsConfig.compilerOptions = {
};
}
userTsConfig.compilerOptions[optionKey] = check.value;
requiredActions.push(_chalk.default.cyan(optionKey) + ' was set to ' + _chalk.default.bold(check.value) + ` (${check.reason})`);
}
} else {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const _ = check;
}
}
if (!('include' in rawConfig)) {
userTsConfig.include = [
'next-env.d.ts',
'**/*.ts',
'**/*.tsx'
];
suggestedActions.push(_chalk.default.cyan('include') + ' was set to ' + _chalk.default.bold(`['next-env.d.ts', '**/*.ts', '**/*.tsx']`));
}
if (!('exclude' in rawConfig)) {
userTsConfig.exclude = [
'node_modules'
];
suggestedActions.push(_chalk.default.cyan('exclude') + ' was set to ' + _chalk.default.bold(`['node_modules']`));
}
if (suggestedActions.length < 1 && requiredActions.length < 1) {
return;
}
await _fs.promises.writeFile(tsConfigPath, CommentJson.stringify(userTsConfig, null, 2) + _os.default.EOL);
if (isFirstTimeSetup) {
console.log(_chalk.default.green(`We detected TypeScript in your project and created a ${_chalk.default.bold('tsconfig.json')} file for you.`) + '\n');
return;
}
console.log(_chalk.default.green(`We detected TypeScript in your project and reconfigured your ${_chalk.default.bold('tsconfig.json')} file for you. Strict-mode is set to ${_chalk.default.bold('false')} by default.`) + '\n');
if (suggestedActions.length) {
console.log(`The following suggested values were added to your ${_chalk.default.cyan('tsconfig.json')}. These values ${_chalk.default.bold('can be changed')} to fit your project's needs:\n`);
suggestedActions.forEach((action)=>console.log(`\t- ${action}`)
);
console.log('');
}
if (requiredActions.length) {
console.log(`The following ${_chalk.default.bold('mandatory changes')} were made to your ${_chalk.default.cyan('tsconfig.json')}:\n`);
requiredActions.forEach((action)=>console.log(`\t- ${action}`)
);
console.log('');
}
}
//# sourceMappingURL=writeConfigurationDefaults.js.map
;