km-web-plugin
Version:
ICE Web Plugin Initializer
162 lines (135 loc) • 4.72 kB
JavaScript
// 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,
};