mirror of
https://github.com/carbon-design-system/carbon-components-svelte.git
synced 2025-09-15 02:11:05 +00:00
feat(preprocess): add optimizeCarbonImports preprocessor (#499)
This commit is contained in:
parent
3d002f3246
commit
855381a486
9 changed files with 825 additions and 6 deletions
97
preprocess/optimize-carbon-imports.js
Normal file
97
preprocess/optimize-carbon-imports.js
Normal file
|
@ -0,0 +1,97 @@
|
|||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
const { parse, walk } = require("svelte/compiler");
|
||||
const api = require("./api.json");
|
||||
|
||||
const carbon = {
|
||||
components: "carbon-components-svelte",
|
||||
icons: "carbon-icons-svelte",
|
||||
pictograms: "carbon-pictograms-svelte",
|
||||
};
|
||||
|
||||
function getPackageJson() {
|
||||
const path_pkg = path.join(process.cwd(), "package.json");
|
||||
|
||||
if (fs.existsSync(path_pkg)) {
|
||||
return JSON.parse(fs.readFileSync(path_pkg, "utf-8"));
|
||||
} else {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
function getCarbonVersions() {
|
||||
const pkg = getPackageJson();
|
||||
const devDeps = pkg.devDependencies || {};
|
||||
const deps = pkg.dependencies || {};
|
||||
|
||||
return [carbon.components, carbon.icons, carbon.pictograms].reduce((a, c) => {
|
||||
let version = devDeps[c] || deps[c];
|
||||
|
||||
if (version !== undefined) {
|
||||
const [major, minor, patch] = version.replace(/^(\^|\~)/, "").split(".");
|
||||
version = major;
|
||||
}
|
||||
|
||||
return { ...a, [c]: version };
|
||||
}, {});
|
||||
}
|
||||
|
||||
const versions = getCarbonVersions();
|
||||
|
||||
function optimizeCarbonImports() {
|
||||
return {
|
||||
script: ({ content, filename }) => {
|
||||
if (/node_modules/.test(filename)) return { code: content };
|
||||
|
||||
const ast = parse(`<script>${content}</script>`, { filename });
|
||||
|
||||
let cursor = -8;
|
||||
|
||||
function replaceContent(node, onSpecifier) {
|
||||
const replacer = node.specifiers.map((i) => onSpecifier(i)).join("\n");
|
||||
const replacee = content.slice(node.start + cursor, node.end + cursor);
|
||||
|
||||
content = content.replace(replacee, replacer);
|
||||
cursor += replacer.length - replacee.length;
|
||||
}
|
||||
|
||||
walk(ast.instance, {
|
||||
enter(node) {
|
||||
if (node.type === "ImportDeclaration") {
|
||||
switch (node.source.value) {
|
||||
case carbon.components:
|
||||
replaceContent(node, ({ local, imported }) => {
|
||||
return `import ${local.name} from "${
|
||||
api.components[imported.name].path
|
||||
}";`;
|
||||
});
|
||||
break;
|
||||
|
||||
case carbon.icons:
|
||||
replaceContent(node, ({ local, imported }) => {
|
||||
return `import ${local.name} from "carbon-icons-svelte/lib/${imported.name}/${imported.name}.svelte";`;
|
||||
});
|
||||
break;
|
||||
|
||||
case carbon.pictograms:
|
||||
replaceContent(node, ({ local, imported }) => {
|
||||
if (versions[carbon.pictograms] === "11") {
|
||||
return `import ${local.name} from "carbon-pictograms-svelte/lib/${imported.name}.svelte";`;
|
||||
}
|
||||
|
||||
return `import ${local.name} from "carbon-pictograms-svelte/lib/${imported.name}/${imported.name}.svelte";`;
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
return { code: content };
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
optimizeCarbonImports,
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue