const fs = require("fs"); const path = require("path"); const rootDir = path.resolve(__dirname, "../"); const distDir = path.resolve(rootDir, "dist"); const componentPath = path.join(__dirname, "./components"); // Import project `package.json` const pkg = require(path.resolve(rootDir, "package.json")); const libraryName = "PrimeVue"; const libraryVersion = pkg.version; const showcaseURL = "https://primefaces.org/primevue/showcase/#/"; const fileModules = {}, veturTags = {}, veturAttributes = {}; const files = fs.readdirSync(componentPath); files.forEach(file => { const { name } = path.parse(file); fileModules[name] = require(`./components//${name}`); }); const webTypes = { $schema: "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json", framework: "vue", name: libraryName, version: libraryVersion, contributions: { html: { "types-syntax": "typescript", "description-markup": "markdown", tags: [], attributes: [] } } }; const addURL = (attr, url, value) => { const newArray = []; attr.forEach(att => { const newObj = {}; Object.keys(att).forEach(key => { newObj[key] = att[key]; if (key === value) newObj["doc-url"] = url; }); newArray.push(newObj); }); return newArray; }; const createWebTypes = component => { const url = showcaseURL + `${component["doc-url"] ? component["doc-url"] : component.name.toLowerCase()}`; // components const tag = { name: component.name, source: { module: libraryName, symbol: component.name }, "doc-url": url, description: component.description }; // directives const attribute = { name: component.name, source: { module: libraryName, symbol: component.name }, description: component.description, "doc-url": url, value: { kind: "expression", type: "function" } }; if (component.props) { tag.attributes = addURL(component.props, url, "default"); tag.attributes.forEach(k => { k["value"] = { kind: "expression", type: k["type"] }; delete k["type"]; }); } if (component.events) { tag.events = addURL(component.events, url, "name"); tag.events.forEach(k => { if (k.arguments) { k.arguments = addURL(k.arguments, url, "name"); } }); } if (component.slots) { tag.slots = addURL(component.slots, url, "name"); } if (component["vue-modifiers"]) { attribute.required = false; attribute["vue-modifiers"] = addURL(component["vue-modifiers"], url, "name"); if (attribute["vue-modifiers"].length < 1) delete attribute["vue-modifiers"]; webTypes.contributions.html.attributes.push(attribute); } webTypes.contributions.html.tags.push(tag); }; const createVeturTags = component => { const attributes = []; if (component.props) { component.props.forEach(comp => { attributes.push(comp.name); }); } if (attributes.length > 0) { veturTags[component.name] = { description: component.description, attributes }; } }; const createVeturAttributes = component => { if (component.props) { component.props.forEach(comp => { veturAttributes[component.name.toLowerCase() + `/${comp.name}`] = { description: comp.description, type: comp.type }; }); } }; Object.keys(fileModules).forEach(p => { createWebTypes(fileModules[p][p]); createVeturTags(fileModules[p][p]); createVeturAttributes(fileModules[p][p]); }); const webTypesJson = JSON.stringify(webTypes, null, 2); fs.writeFileSync(path.resolve(distDir, "web-types.json"), webTypesJson); const veturTagsJson = JSON.stringify(veturTags, null, 2); fs.writeFileSync(path.resolve(distDir, "vetur-tags.json"), veturTagsJson); const veturAttributesJson = JSON.stringify(veturAttributes, null, 2); fs.writeFileSync(path.resolve(distDir, "vetur-attributes.json"), veturAttributesJson);