UNPKG

css-module-types

Version:

TypeScript Language Service Plugin for CSS modules.

69 lines (68 loc) 3.23 kB
"use strict"; 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 }; };