css-module-types
Version:
TypeScript Language Service Plugin for CSS modules.
69 lines (68 loc) • 3.23 kB
JavaScript
;
var icss_utils_1 = require("icss-utils");
var ts_module = require("typescript/lib/tsserverlibrary");
var path = require("path");
var postcss = require("postcss");
var postcssIcssSelectors = require("postcss-icss-selectors");
module.exports = function init(_a) {
var ts = _a.typescript;
function isCSS(fileName) {
return /\.css$/.test(fileName);
}
function isRelativeCSS(fileName) {
return isCSS(fileName) && /^\.\.?($|[\\/])/.test(fileName);
}
function create(info) {
var processor = postcss(postcssIcssSelectors({ mode: 'local' }));
function getDtsSnapshot(scriptSnapshot) {
var css = scriptSnapshot.getText(0, scriptSnapshot.getLength());
var dts = Object.keys(icss_utils_1.extractICSS(processor.process(css).root).icssExports)
.map(function (exportName) { return "export const " + exportName + ": string;"; })
.join('');
return ts.ScriptSnapshot.fromString(dts);
}
var clssf = ts.createLanguageServiceSourceFile;
ts.createLanguageServiceSourceFile = function (fileName, scriptSnapshot, scriptTarget, version, setNodeParents, scriptKind, cheat) {
if (isCSS(fileName)) {
scriptSnapshot = getDtsSnapshot(scriptSnapshot);
}
var sourceFile = clssf(fileName, scriptSnapshot, scriptTarget, version, setNodeParents, scriptKind);
if (isCSS(fileName)) {
sourceFile.isDeclarationFile = true;
}
return sourceFile;
};
var ulssf = ts.updateLanguageServiceSourceFile;
ts.updateLanguageServiceSourceFile = function (sourceFile, scriptSnapshot, version, textChangeRange, aggressiveChecks, cheat) {
if (isCSS(sourceFile.fileName)) {
scriptSnapshot = getDtsSnapshot(scriptSnapshot);
}
var sourceFile = ulssf(sourceFile, scriptSnapshot, version, textChangeRange, aggressiveChecks);
if (isCSS(sourceFile.fileName)) {
sourceFile.isDeclarationFile = true;
}
return sourceFile;
};
if (info.languageServiceHost.resolveModuleNames) {
var rmn_1 = info.languageServiceHost.resolveModuleNames.bind(info.languageServiceHost);
info.languageServiceHost.resolveModuleNames = function (moduleNames, containingFile, reusedNames) {
var resolvedCSS = [];
return rmn_1(moduleNames.filter(function (moduleName) {
if (isRelativeCSS(moduleName)) {
resolvedCSS.push({
resolvedFileName: path.resolve(path.dirname(containingFile), moduleName),
extension: ts_module.Extension.Dts,
});
return false;
}
return true;
}), containingFile, reusedNames).concat(resolvedCSS);
};
}
return info.languageService;
}
function getExternalFiles(project) {
return project.getFileNames().filter(isCSS);
}
return { create: create, getExternalFiles: getExternalFiles };
};