diff --git a/dependenciesListGenerator.mjs b/dependenciesListGenerator.mjs new file mode 100644 index 0000000..7f553c3 --- /dev/null +++ b/dependenciesListGenerator.mjs @@ -0,0 +1,161 @@ +import fs from "fs"; +import path from "path"; +import registryURL from "registry-url"; +import { fileURLToPath } from "url"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const src = path.join(__dirname, "src"), + pages = path.join(src, "pages"), + components = path.join(src, "components"), + stores = path.join(src, "stores"), + router = path.join(src, "router"), + utils = path.join(components, "utils"), + packageJson = path.join(__dirname, "package.json"), + thankYouPageDir = path.join(pages, "ThankYou"), + npmRegistryURL = registryURL(); + +const NPMPackageLink = `https://www.npmjs.com/package/`; + +let modules = []; + +/* + Single module looks like this + module = { + "name": string, + "link": string, + "description": string, + "homepage": string + } + + link here is the npm link to the package +*/ + +async function getPackageDetails(name) { + try { + const data = await (await fetch(npmRegistryURL + name)).json(); + + return { + success: { + description: data.description, + homepage: data.homepage, + }, + error: false, + }; + } catch (e) { + return { + success: false, + error: e, + }; + } +} + +function extractModules(content) { + const lines = content.split(/\n/g); + + let modules = []; + + let j = 0; + + while (lines[j]) { + if (lines[j].match("from") || lines[j].startsWith("import")) { + lines[j] = lines[j] + .split(/\s/) + .at(-2) + .replace(/\"|\'|;/g, ""); + if (!lines[j].match(/^\.[\/\\\.]*/g)) { + modules.push(lines[j]); + } + } + j++; + } + modules = new Set(modules); + modules = Array.from(modules); + return modules; +} + +function getDirModules(dir) { + const files = fs.readdirSync(dir); + let tempModules = []; + + for (let i = 0; i < files.length; i++) { + if (files[i].match(/\./)) { + const content = fs.readFileSync(path.join(dir, files[i]), "utf-8"); + tempModules = new Set([...tempModules, ...extractModules(content)]); + + tempModules = Array.from(tempModules); + } + } + return tempModules; +} + +function getSrcModules(src) { + const moduleFolders = fs.readdirSync(src); + let tempModules = []; + for (let i = 0; i < moduleFolders.length; i++) { + tempModules = new Set([ + ...tempModules, + ...getDirModules(path.join(src, moduleFolders[i])), + ]); + + tempModules = Array.from(tempModules); + } + return tempModules; +} + +async function generateDependenciesList() { + console.log(`Generating list of dependencies for thank you page... 👷‍♂️`); + modules = new Set( + [ + ...getSrcModules(pages), + ...getSrcModules(components), + ...getDirModules(router), + ...getDirModules(stores), + ...getDirModules(utils), + ...getDirModules(src), + ].map((e) => (e.startsWith("@") ? e : e.split(/[\/\\]/)[0])) + ); + + modules = Array.from(modules); + + // there are a lot of garbage generated + // let's clean that now by checking + // if the module found exists in the package.json file + const packageJsonContent = JSON.parse(fs.readFileSync(packageJson, "utf-8")); + + const realDependencies = Object.keys(packageJsonContent.dependencies); + + modules = modules.filter((e) => realDependencies.includes(e)); + + for (let i = 0; i < modules.length; i++) { + let details = await getPackageDetails(modules[i]); + let final = { + name: modules[i], + link: NPMPackageLink + modules[i], + description: details.success?.description || undefined, + homepage: details.success?.homepage || undefined, + }; + modules[i] = final; + } + + const dependenciesFile = `const dependencies = ${JSON.stringify( + modules, + null, + 4 + )}; \n\n export default dependencies;`; + + fs.writeFileSync( + path.join(thankYouPageDir, "dependencies.js"), + dependenciesFile, + "utf-8" + ); + + console.log(`List of dependencies successfully generated ✨`); +} + +export default () => ({ + name: "dependencies-list-generator", + apply: "build", + async configResolved() { + await generateDependenciesList(); + }, +}); diff --git a/package-lock.json b/package-lock.json index fda6665..706232f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,6 +24,7 @@ "moment": "^2.29.4", "moment-timezone": "^0.5.43", "pinia": "^2.1.6", + "registry-url": "^6.0.1", "sql-formatter": "^12.2.4", "sql-query-identifier": "^2.5.0", "vue": "^3.3.4", @@ -596,6 +597,14 @@ "date-fns": ">=2.0.0" } }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/discontinuous-range": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", @@ -674,6 +683,11 @@ "node": ">=12.0.0" } }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, "node_modules/jose": { "version": "4.14.4", "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", @@ -725,6 +739,14 @@ "node": ">= 16" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/moment": { "version": "2.29.4", "license": "MIT", @@ -880,10 +902,38 @@ "node": ">=0.12" } }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, "node_modules/regenerator-runtime": { "version": "0.13.11", "license": "MIT" }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/remedial": { "version": "1.0.8", "license": "(MIT OR Apache-2.0)", @@ -946,6 +996,14 @@ "node": ">= 10.13" } }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/vite": { "version": "4.4.9", "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", diff --git a/package.json b/package.json index 6028c23..97b5ac8 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "moment": "^2.29.4", "moment-timezone": "^0.5.43", "pinia": "^2.1.6", + "registry-url": "^6.0.1", "sql-formatter": "^12.2.4", "sql-query-identifier": "^2.5.0", "vue": "^3.3.4", diff --git a/src/components/Pageheader/index.vue b/src/components/Pageheader/index.vue index 15c3488..8db5eb0 100644 --- a/src/components/Pageheader/index.vue +++ b/src/components/Pageheader/index.vue @@ -1,14 +1,14 @@