restructure_templates.js (156 lines of code) (raw):
import { mkdir, readFileSync, rename, writeFile } from 'fs';
import path from 'path';
const manifestNamesList = JSON.parse(readFileSync(path.resolve('./manifest.json'), {
encoding: 'utf-8'
}));
const getNormWorkflowName = (workflowName) => {
return workflowName
.replace(/-([a-z])/g, (_, letter) => `_${letter.toUpperCase()}`)
.replace(/^([a-z])/, (_, letter) => letter.toUpperCase());
};
const connectorIdForBuiltInOperations = {
chunktext: "connectionProviders/dataOperationNew",
scope: "connectionProviders/control",
xslt: "connectionProviders/xmlOperations",
recurrence: "connectionProviders/schedule",
request: "connectionProviders/request",
}
const featuredOperationsToConnectors = (featuredOperations) => {
return featuredOperations?.map((featuredOperation) => {
const connectorIdForOperation = connectorIdForBuiltInOperations[featuredOperation.type.toLowerCase()];
if (!connectorIdForOperation) {
console.error('Connector Id is unknown for this operation :', featuredOperation.type);
return;
}
return {
id: connectorIdForOperation,
kind: "builtin",
};
}) ?? [];
}
const restructureSingleWorkflow = (folderName, manifestFile) => {
const nonWorkflowArtifacts = manifestFile.artifacts?.filter((artifact) => artifact.type !== 'workflow') ?? undefined;
const updatedTemplateManifest = {
id: folderName,
title: manifestFile.title,
summary: manifestFile.description,
artifacts: (nonWorkflowArtifacts?.length > 0) ? nonWorkflowArtifacts : undefined,
skus: manifestFile.skus ?? ["standard"],
workflows: {
default: {name: getNormWorkflowName(folderName)},
},
featuredConnectors: [
...featuredOperationsToConnectors(manifestFile?.featuredOperations),
...(Object.values(manifestFile?.connections)?.map((connection) => ({
id: connection.connectorId,
kind: connection.kind,
})) ?? [])
],
details: {
...(manifestFile.details ?? {}),
Type: "Workflow",
},
}
if (manifestFile?.tags) {
updatedTemplateManifest.tags = manifestFile.tags;
}
const workflowArtifact = manifestFile.artifacts?.find((artifact) => artifact.type === 'workflow');
const workflowManifest = {
id: "default",
title: manifestFile.title,
summary: manifestFile.description,
description: manifestFile.detailsDescription,
prerequisites: manifestFile.prerequisites,
kinds: (manifestFile.kinds?.length > 0) ? manifestFile.kinds : undefined,
artifacts: [workflowArtifact],
images: {
light: manifestFile.images.light,
dark: manifestFile.images.dark
},
parameters: manifestFile.parameters,
connections: manifestFile.connections
};
// Overwrite template manifest
writeFile(`./${folderName}/manifest.json`, JSON.stringify(updatedTemplateManifest, null, 4), () => {});
// Create subfolder for workflow
mkdir(`./${folderName}/default`, { recursive: true }, () => {});
// Create workflow manifest
writeFile(`./${folderName}/default/manifest.json`, JSON.stringify(workflowManifest, null, 4), () => {});
// Move images to subfolder
for (const imageFileName of Object.values(manifestFile.images)) {
rename(`./${folderName}/${imageFileName}.png`, `./${folderName}/default/${imageFileName}.png`, (err) => {
if (err) {
console.error('Error moving file:', err);
return;
}
})
}
// Move workflow to subfolder
rename(`./${folderName}/${workflowArtifact.file}`, `./${folderName}/default/${workflowArtifact.file}`, (err) => {
if (err) {
console.error('Error moving file:', err);
return;
}
});
}
const restructureMultiWorkflow = (folderName, templateManifest) => {
const updatedTemplateManifest = {
id: folderName,
title: templateManifest.title,
summary: templateManifest.description,
description: templateManifest.detailsDescription,
artifacts: (templateManifest.artifacts?.length > 0) ? templateManifest.artifacts : undefined,
skus: ["standard"],
workflows: templateManifest.workflows,
featuredConnectors: [
...featuredOperationsToConnectors(templateManifest?.featuredOperations),
...(templateManifest?.featuredConnectors ?? Object.values(templateManifest?.connections)?.map((connection) => ({
id: connection.connectorId,
kind: connection.kind,
})) ?? [])
],
details: {
...(templateManifest.details ?? {}),
Type: "Accelerator",
},
};
const allTagsCombined = templateManifest?.tags ?? [];
for (const workflowFolder of Object.keys(templateManifest.workflows)) {
const workflowManifest = JSON.parse(readFileSync(path.resolve(`./${folderName}/${workflowFolder}/manifest.json`), {
encoding: 'utf-8'
}));
const updatedWorkflowManifest = {
id: workflowFolder,
title: workflowManifest.title,
summary: workflowManifest.description,
description: workflowManifest.detailsDescription,
prerequisites: workflowManifest.prerequisites,
kinds: (workflowManifest.kinds?.length > 0) ? workflowManifest.kinds : undefined,
artifacts: workflowManifest.artifacts,
images: {
light: workflowManifest.images.light,
dark: workflowManifest.images.dark
},
parameters: workflowManifest.parameters,
connections: workflowManifest.connections
};
if (workflowManifest?.tags) {
allTagsCombined.push(...workflowManifest.tags);
}
// Overwrite workflow manifest
writeFile(`./${folderName}/${workflowFolder}/manifest.json`, JSON.stringify(updatedWorkflowManifest, null, 4), () => {});
}
const allUniqueTags = [...new Set(allTagsCombined)];
if (allUniqueTags.length > 0) {
updatedTemplateManifest.tags = allUniqueTags;
}
// Overwrite template manifest
writeFile(`./${folderName}/manifest.json`, JSON.stringify(updatedTemplateManifest, null, 4), () => {});
}
const run = async () => {
for (const folderName of manifestNamesList) {
const manifestFile = JSON.parse(readFileSync(path.resolve(`./${folderName}/manifest.json`), {
encoding: 'utf-8'
}));
const manifestFileWorkflowsCount = Object.keys(manifestFile?.workflows ?? {}).length;
// NOTE: restructureMultiWorkflow is idempotent
if (manifestFileWorkflowsCount > 1) {
restructureMultiWorkflow(folderName, manifestFile);
// NOTE: restructureSingleWorkflow is not idempotent - checking if it has been run before
} else if (manifestFileWorkflowsCount === 0) {
restructureSingleWorkflow(folderName, manifestFile);
}
}
}
run();