123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- import { createRequire } from 'node:module';
- import path from 'upath';
- import { capitalize, camelize } from 'vue';
- function parseTemplate(source) {
- const components = createSet(source.matchAll(/(?:var|const) (\w+) = _resolveComponent\("([\w-.]+)"\);?/gm));
- const directives = createSet(source.matchAll(/(?:var|const) (\w+) = _resolveDirective\("([\w-.]+)"\);?/gm));
- return { components, directives };
- }
- function createSet(matches) {
- return new Set(Array.from(matches, (i) => ({
- symbol: i[1],
- name: capitalize(camelize(i[2])),
- index: i.index,
- length: i[0].length
- })));
- }
- const require$1 = createRequire(import.meta.url);
- const importMap = require$1("vuetify/dist/json/importMap.json");
- const importMapLabs = require$1("vuetify/dist/json/importMap-labs.json");
- function getImports(source, options) {
- const { components, directives } = parseTemplate(source);
- const resolvedComponents = [];
- const resolvedDirectives = [];
- const imports = /* @__PURE__ */ new Map();
- const ignore = isObject(options.autoImport) && options.autoImport.ignore || null;
- const includeLabs = isObject(options.autoImport) && options.autoImport.labs;
- const map = includeLabs ? {
- components: { ...importMap.components, ...importMapLabs.components },
- directives: importMap.directives
- } : importMap;
- if (components.size || directives.size) {
- components.forEach((component) => {
- if (ignore?.includes(component.name))
- return;
- if (component.name in importMap.components) {
- resolvedComponents.push(component);
- } else if (includeLabs && component.name in importMapLabs.components) {
- resolvedComponents.push(component);
- }
- });
- directives.forEach((directive) => {
- if (importMap.directives.includes(directive.name) && !ignore?.includes(directive.name)) {
- resolvedDirectives.push(directive);
- }
- });
- }
- resolvedComponents.forEach((component) => {
- addImport(imports, component.name, component.symbol, "vuetify/lib/" + map.components[component.name].from);
- });
- resolvedDirectives.forEach((directive) => {
- addImport(imports, directive.name, directive.symbol, "vuetify/lib/directives/index.mjs");
- });
- return {
- imports,
- components: resolvedComponents,
- directives: resolvedDirectives
- };
- }
- function addImport(imports, name, as, from) {
- if (!imports.has(from)) {
- imports.set(from, []);
- }
- imports.get(from).push(`${name} as ${as}`);
- }
- function generateImports(source, options) {
- const { imports, components, directives } = getImports(source, options);
- let code = "";
- if (components.length || directives.length) {
- code += "\n\n/* Vuetify */\n";
- Array.from(imports).sort((a, b) => a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0).forEach(([from, names]) => {
- code += `import { ${names.join(", ")} } from "${from}"
- `;
- });
- code += "\n";
- source = [...components, ...directives].reduce((acc, v) => {
- return acc.slice(0, v.index) + " ".repeat(v.length) + acc.slice(v.index + v.length);
- }, source);
- if (!source.includes("_resolveComponent(")) {
- source = source.replace("resolveComponent as _resolveComponent, ", "");
- }
- if (!source.includes("_resolveDirective(")) {
- source = source.replace("resolveDirective as _resolveDirective, ", "");
- }
- }
- return { code, source };
- }
- const require = createRequire(import.meta.url);
- function resolveVuetifyBase() {
- return path.dirname(require.resolve("vuetify/package.json", { paths: [process.cwd()] }));
- }
- function isObject(value) {
- return value !== null && typeof value === "object";
- }
- function includes(arr, val) {
- return arr.includes(val);
- }
- function normalizePath(p) {
- p = path.normalize(p);
- return /^[a-z]:\//i.test(p) ? "/" + p : p;
- }
- function toKebabCase(str = "") {
- return str.replace(/[^a-z]/gi, "-").replace(/\B([A-Z])/g, "-$1").toLowerCase();
- }
- const defaultTags = {
- video: ["src", "poster"],
- source: ["src"],
- img: ["src"],
- image: ["xlink:href", "href"],
- use: ["xlink:href", "href"]
- };
- const transformAssetUrls = {
- VAppBar: ["image"],
- VAvatar: ["image"],
- VBanner: ["avatar"],
- VCard: ["image", "prependAvatar", "appendAvatar"],
- VCardItem: ["prependAvatar", "appendAvatar"],
- VCarouselItem: ["src", "lazySrc", "srcset"],
- VChip: ["prependAvatar", "appendAvatar"],
- VImg: ["src", "lazySrc", "srcset"],
- VListItem: ["prependAvatar", "appendAvatar"],
- VNavigationDrawer: ["image"],
- VParallax: ["src", "lazySrc", "srcset"],
- VToolbar: ["image"]
- };
- for (const [tag, attrs] of Object.entries(transformAssetUrls)) {
- attrs.forEach((attr) => {
- if (/[A-Z]/.test(attr)) {
- attrs.push(toKebabCase(attr));
- }
- });
- transformAssetUrls[toKebabCase(tag)] = attrs;
- }
- Object.assign(transformAssetUrls, defaultTags);
- export { generateImports, includes, isObject, normalizePath, resolveVuetifyBase, toKebabCase, transformAssetUrls };
|