UNPKG

km-web-plugin

Version:

ICE Web Plugin Initializer

162 lines (135 loc) 4.72 kB
// Template processing engine for variable replacement const TEMPLATE_REGEX = /\{\{(\w+)\}\}/g; function getTemplateVariables(options) { return { projectName: options.projectNameKebab, projectNameKebab: options.projectNameKebab, projectNameCamel: options.projectNameCamel, projectNamePascal: options.projectNamePascal, appNameNoSpaces: options.appNameNoSpaces, appNameKebab: options.appNameKebab, appNameCamel: options.appNameCamel, appNamePascal: options.appNamePascal, exampleplugin: options.projectNameKebab + "plugin", "example-popup": options.projectNameKebab + "-popup", "example-web-app": options.projectNameKebab + "-web-app", Example: options.appNamePascal, example: options.appNameCamel, ExampleForm: options.appNamePascal + "Form", ExampleRecord: options.appNamePascal + "Record", ExampleService: options.appNamePascal + "Service", useExample: "use" + options.appNamePascal, "Example Name": options.appName + " Name", "Add New Example": "Add New " + options.appName, "Edit Example": "Edit " + options.appName, "KM.WEB.Example": "KM.WEB." + options.appNameNoSpaces, "KM.WEB.Example.Log": "KM.WEB." + options.appNameNoSpaces + ".Log", }; } export function processTemplate(content, options) { const variables = getTemplateVariables(options); let processed = content.replace(TEMPLATE_REGEX, (match, varName) => { if (varName === "appName") { return options.appName; } return variables[varName] || match; }); const sortedKeys = Object.keys(variables).sort((a, b) => b.length - a.length); for (const key of sortedKeys) { if (["example", "projectName"].includes(key)) continue; const value = variables[key]; const regex = new RegExp(escapeRegExp(key), "g"); processed = processed.replace(regex, value); } return processed; } export function processFilename(filename, options) { let processed = filename; // Handle specific filename patterns if (filename.includes("Example")) { processed = processed.replace(/Example/g, options.appNamePascal); } if (filename.includes("example")) { processed = processed.replace(/example/g, options.appNameCamel); } if (filename === "example.ts") { processed = options.appNameCamel + ".ts"; } return processed; } function escapeRegExp(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } export function processSpecialFiles(filePath, content, options) { if (filePath.endsWith("package.json")) { return processPackageJson(content, options); } if (filePath.includes("vite") && filePath.endsWith(".ts")) { return processViteConfig(content, options); } if (filePath.endsWith(".ts") || filePath.endsWith(".vue")) { return processTypeScriptImports(content, options); } return content; } function processPackageJson(content, options) { try { const pkg = JSON.parse(content); pkg.name = options.projectNameKebab; return JSON.stringify(pkg, null, 4); } catch (error) { return processTemplate(content, options); } } function processViteConfig(content, options) { let processed = content; processed = processed.replace( /name:\s*['"][\w-]+['"]/g, `name: '${options.projectNameKebab}'`, ); processed = processed.replace( /fileName:\s*\(format\)\s*=>\s*`[\w-]+\.js`/g, `fileName: (format) => \`${options.projectNameKebab}.js\``, ); processed = processed.replace( /fileName:\s*['"][\w-]+['"]/g, `fileName: '${options.projectNameKebab}'`, ); processed = processed.replace( /entryFileNames:\s*['"][\w-]+\.js['"]/g, `entryFileNames: '${options.projectNameKebab}.js'`, ); if (content.includes("dist/um")) { } else if (content.includes("dist/plugin")) { processed = processed.replace( /[\w-]+plugin\.js/g, `${options.projectNameKebab}plugin.js`, ); } else if (content.includes("dist/popup")) { processed = processed.replace( /[\w-]+-popup\.js/g, `${options.projectNameKebab}-popup.js`, ); } else if (content.includes("dist/globaltool")) { processed = processed.replace( /globaltool\.js/g, `${options.projectNameKebab}-globaltool.js`, ); } return processTemplate(processed, options); } function processTypeScriptImports(content, options) { let processed = content.replace( /from\s+['"]@\/types\/example['"]/g, `from '@/types/${options.appNameCamel}'`, ); if (content.includes("example.ts")) { processed = processed.replace(/example\.ts/g, `${options.appNameCamel}.ts`); } return processTemplate(processed, options); } export default { processTemplate, processFilename, processSpecialFiles, };