@opd/css-modules-typings-loader
Version:
css modules typings loader for webpack
79 lines (78 loc) • 3.63 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _acorn = require("acorn");
var _acornWalk = require("acorn-walk");
var _fs = _interopRequireDefault(require("fs"));
var _util = require("util");
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } // import loaderUtils from 'loader-utils'
// const schema = {
// type: 'object',
// properties: {},
// }
const loader = async function (content) {
const declarationPath = this.resourcePath + '.d.ts';
const parsed = (0, _acorn.parse)(content, {
sourceType: 'module',
ecmaVersion: 'latest'
});
const namedExportKeys = [];
const nestedExportKeys = [];
(0, _acornWalk.simple)(parsed, {
ExpressionStatement(node) {
(0, _acornWalk.simple)(node, {
// console.log(node)
AssignmentExpression(node) {
(0, _acornWalk.simple)(node, {
Property(node) {
const key = node.key.value;
nestedExportKeys.push(key);
}
});
}
});
},
ExportNamedDeclaration(node) {
(0, _acornWalk.simple)(node, {
VariableDeclarator(node) {
namedExportKeys.push(node.id.name);
}
});
}
});
if (!nestedExportKeys.length && !namedExportKeys.length) {
return content;
}
const nestedExportDeclarations = nestedExportKeys.map(key => `'${key}': string;`).join('\n');
const namedExportDeclarations = namedExportKeys.filter(key => {
// remove invalid variable names
return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key);
}).map(key => `export const ${key}: string;`).join('\n');
const nestedContent = nestedExportKeys.length ? `
interface CSSModules {
${nestedExportDeclarations}
}
export const styles: CSSModules
export default styles
` : '';
const namedContent = namedExportKeys.length ? namedExportDeclarations : '';
const fileContent = [nestedContent, namedContent].join('\n');
const prettier = (await Promise.resolve().then(() => _interopRequireWildcard(require('prettier')))).default;
const config = await prettier.resolveConfig(declarationPath);
try {
const formattedContent = await prettier.format(fileContent, {
...config,
parser: 'typescript'
});
await (0, _util.promisify)(_fs.default.writeFile)(declarationPath, formattedContent, {
encoding: 'utf-8'
});
} catch (error) {}
return content;
};
var _default = loader;
exports.default = _default;