UNPKG

esmodule-builder

Version:

ECMAScript-Module (ES Module) builder.

205 lines 19.3 kB
import { SourceMapKind } from '../config.mjs'; import P from '../platform.mjs'; import meta from '../meta.mjs'; import log from 'npmlog'; let ts; const defaultCompilerOptions = { target: 'esnext', //lib: ['esnext'], module: 'esnext', moduleResolution: 'node', esModuleInterop: true, strict: true, alwaysStrict: true, declaration: true, }; async function build(project) { if (!ts) { try { ts = (await import('typescript')).default; } catch (error) { throw new Error('Need installing "typescript".'); } } const sourcePath = project.modulePathWithoutExtension + '.ts'; const sourceText = project.sourceMap.wholeContent(); const compilerOptions = { /* default compilerOptions */ ...defaultCompilerOptions, /* project compilerOptions */ ...{ sourceMap: project.config.module.sourceMap != SourceMapKind.None, declarationMap: project.config.module.sourceMap != SourceMapKind.None, }, /* custom compilerOptions */ ...project.config.typescript.compilerOptions, }; if (project.config.debug.outputSource) { P.writeFile(P.joinPath(project.baseDirectoryPath, project.config.debug.outputSource, 'module.ts'), sourceText); P.writeFile(P.joinPath(project.baseDirectoryPath, project.config.debug.outputSource, 'tsconfig.json'), createTSConfigImage(project.config, compilerOptions)); } const parsed = parseConfig(project, [sourcePath], compilerOptions); if (parsed.errors.length > 0) { displayDiagnostics(project, parsed.errors); return; } if (parsed.options.locale) { ts.validateLocaleAndSetLanguage(parsed.options.locale, ts.sys, parsed.errors); } const result = await transpileModule(project, parsed.options, ts.createSourceFile(sourcePath, sourceText, parsed.options.target)); log.silly('tsc', result.toString()); displayDiagnostics(project, result.diagnostics); const errorOccurred = result.diagnostics.length > 0; if (result.diagnostics.length == 0) { if (project.config.module.sourceMap == SourceMapKind.None) { writeFile(project, '.mjs', result.module); writeFile(project, '.d.ts', result.declaration); } else { const moduleMap = await project.sourceMap.originalSourceMap(JSON.parse(result.moduleMap)); moduleMap.file = moduleMap.file.replace(/\.js$/, '.mjs'); switch (project.config.module.sourceMap) { case SourceMapKind.File: result.module += project.sourceMap.createFileComment(moduleMap); break; case SourceMapKind.Inline: result.module += project.sourceMap.createInlineComment(moduleMap); break; } const declarationMap = await project.sourceMap.originalSourceMap(JSON.parse(result.declarationMap)); switch (project.config.module.sourceMap) { case SourceMapKind.File: result.declaration += project.sourceMap.createFileComment(declarationMap); break; case SourceMapKind.Inline: result.declaration += project.sourceMap.createInlineComment(declarationMap); break; } writeFile(project, '.mjs', result.module); writeFile(project, '.d.ts', result.declaration); if (project.config.module.sourceMap == SourceMapKind.File) { writeFile(project, '.mjs.map', JSON.stringify(moduleMap)); writeFile(project, '.d.ts.map', JSON.stringify(declarationMap)); } const exitCode = errorOccurred ? 1 : 0; log.silly('tsc', `Process exiting with code '${exitCode}'.`); } } } function createTSConfigImage(esmc, compilerOptions) { const config = { compilerOptions, include: esmc.source.include, exclude: esmc.source.exclude, }; return JSON.stringify(config, null, '\t'); } function parseConfig(project, sources, compilerOptions) { const host = { useCaseSensitiveFileNames: false, readDirectory: (rootDir, extensions, excludes, includes, depth) => sources, fileExists: (path) => P.testFileExists(path), readFile: (path) => P.readFile(path), }; return ts.parseJsonConfigFileContent({ include: sources, compilerOptions }, host, project.baseDirectoryPath); } async function transpileModule(project, options, sourceFile) { const output = { module: '', declaration: '', }; const compilerHost = ts.createCompilerHost(options); const getSourceFileBase = compilerHost.getSourceFile; compilerHost.getSourceFile = (fileName, languageVersion, onError, shouldCreateNewSourceFile) => fileName === sourceFile.fileName ? sourceFile : getSourceFileBase(fileName, languageVersion, onError, shouldCreateNewSourceFile); compilerHost.writeFile = async (fileName, text) => { if (fileName.endsWith('.js')) { // Quick Fix: import 'xx' -> import 'xx.mjs' const sourceDir = project.moduleDirectoryPath; text = text.replace(/^\s*(import\s.+)(?:'(.*?)'|"(.*?)")/gm, ($0, $1, $2, $3) => { const path = P.joinPath(sourceDir, ($2 || $3) + '.mjs'); return P.testFileExists(path) ? `${$1}'${$2 || $3}.mjs'` : $0; }); text = text.replace(/\/\/#\ssourceMappingURL=.+$/, ''); output.module = text; } else if (fileName.endsWith('.d.ts')) { text = text.replace(/\/\/#\ssourceMappingURL=.+$/, ''); output.declaration = text; } else if (fileName.endsWith('.js.map')) { output.moduleMap = text; } else if (fileName.endsWith('.d.ts.map')) { output.declarationMap = text; } else { log.warn('esmc', 'Unknown generated file.'); } }; const program = ts.createProgram([sourceFile.fileName], options, compilerHost); const emitResult = program.emit(); emitResult.diagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics); return { ...output, ...emitResult, }; } function writeFile(project, extension, text) { const path = P.resolvePath(project.modulePathWithoutExtension + extension); P.writeFile(path, text); log.info(meta.program, `'${path}' generated.`); } function displayDiagnostics(project, diagnostics) { diagnostics.forEach(diagnostic => { const loglevel = toLogLevel(diagnostic.category); const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n'); if (diagnostic.file) { const { line: lineOfModule, character: column } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start); if (diagnostic.file.fileName == (project.modulePathWithoutExtension + '.ts')) { const { path, line } = project.sourceMap.getLocation(lineOfModule); const location = `${path} (${line + 1},${column + 1})`; log.log(loglevel, 'tsc', `${location}: ${message}`); } else { const path = P.relativePath(project.baseDirectoryPath, diagnostic.file.fileName); const line = lineOfModule; const location = `${path} (${line + 1},${column + 1})`; log.log(loglevel, 'tsc', `${location}: ${message}`); } } else { log.log(loglevel, 'tsc', message); } }); function toLogLevel(category) { switch (category) { case ts.DiagnosticCategory.Warning: return 'warn'; case ts.DiagnosticCategory.Error: return 'error'; case ts.DiagnosticCategory.Suggestion: return 'info'; case ts.DiagnosticCategory.Message: return 'notice'; } } } // function getNewLineCharacter(options: ts.CompilerOptions | ts.PrinterOptions): string { // const carriageReturnLineFeed = '\r\n'; // const lineFeed = '\n'; // switch (options.newLine) { // case ts.NewLineKind.CarriageReturnLineFeed: // return carriageReturnLineFeed; // case ts.NewLineKind.LineFeed: // return lineFeed; // } // return require('os').EOL; // } export default { build, }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNjLm1qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9jb21waWxlci90c2MubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBVSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFckQsT0FBTyxDQUFDLE1BQU0saUJBQWlCLENBQUE7QUFDL0IsT0FBTyxJQUFJLE1BQU0sYUFBYSxDQUFBO0FBQzlCLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQTtBQUt4QixJQUFJLEVBQWEsQ0FBQTtBQUlqQixNQUFNLHNCQUFzQixHQUFHO0lBQzlCLE1BQU0sRUFBRSxRQUFRO0lBQ2hCLGtCQUFrQjtJQUNsQixNQUFNLEVBQUUsUUFBUTtJQUNoQixnQkFBZ0IsRUFBRSxNQUFNO0lBQ3hCLGVBQWUsRUFBRSxJQUFJO0lBQ3JCLE1BQU0sRUFBRSxJQUFJO0lBQ1osWUFBWSxFQUFFLElBQUk7SUFDbEIsV0FBVyxFQUFFLElBQUk7Q0FDakIsQ0FBQTtBQWFELEtBQUssVUFBVSxLQUFLLENBQ25CLE9BQWdCO0lBRWhCLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDUixJQUFJO1lBQ0gsRUFBRSxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUE7U0FDekM7UUFDRCxPQUFPLEtBQUssRUFBRTtZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQTtTQUNoRDtLQUNEO0lBRUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQTtJQUU3RCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFBO0lBRW5ELE1BQU0sZUFBZSxHQUFHO1FBQ3ZCLDZCQUE2QjtRQUM3QixHQUFHLHNCQUFzQjtRQUV6Qiw2QkFBNkI7UUFDN0IsR0FBRztZQUNGLFNBQVMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0s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