packages/cli: move reading of plugin template data to plugin diff

This commit is contained in:
Patrik Oldsberg
2020-05-21 19:31:14 +02:00
parent 12c669e904
commit f0107283f8
2 changed files with 40 additions and 37 deletions
+38 -1
View File
@@ -14,6 +14,7 @@
* limitations under the License.
*/
import fs from 'fs-extra';
import { Command } from 'commander';
import {
diffTemplateFiles,
@@ -23,6 +24,13 @@ import {
makeCheckPromptFunc,
yesPromptFunc,
} from '../../lib/diff';
import { paths } from '../../lib/paths';
import { version } from '../../lib/version';
export type PluginData = {
id: string;
name: string;
};
const fileHandlers = [
{
@@ -54,7 +62,36 @@ export default async (cmd: Command) => {
promptFunc = yesPromptFunc;
}
const templateFiles = await diffTemplateFiles('default-plugin');
const data = await readPluginData();
const templateFiles = await diffTemplateFiles('default-plugin', {
version,
...data,
});
await handleAllFiles(fileHandlers, templateFiles, promptFunc);
await finalize();
};
// Reads templating data from the existing plugin
async function readPluginData(): Promise<PluginData> {
let name: string;
try {
const pkg = require(paths.resolveTarget('package.json'));
name = pkg.name;
} catch (error) {
throw new Error(`Failed to read target package, ${error}`);
}
const pluginTsContents = await fs.readFile(
paths.resolveTarget('src/plugin.ts'),
'utf8',
);
// TODO: replace with some proper parsing logic or plugin metadata file
const pluginIdMatch = pluginTsContents.match(/id: ['"`](.+?)['"`]/);
if (!pluginIdMatch) {
throw new Error(`Failed to parse plugin.ts, no plugin ID found`);
}
const id = pluginIdMatch[1];
return { id, name };
}
+2 -36
View File
@@ -23,44 +23,13 @@ import {
import handlebars from 'handlebars';
import recursiveReadDir from 'recursive-readdir';
import { paths } from '../paths';
import { version } from '../version';
import { FileDiff } from './types';
export type PluginInfo = {
id: string;
name: string;
};
export type TemplatedFile = {
path: string;
contents: string;
};
// Reads info from the existing plugin
async function readPluginInfo(): Promise<PluginInfo> {
let name: string;
try {
const pkg = require(paths.resolveTarget('package.json'));
name = pkg.name;
} catch (error) {
throw new Error(`Failed to read target package, ${error}`);
}
const pluginTsContents = await fs.readFile(
paths.resolveTarget('src/plugin.ts'),
'utf8',
);
// TODO: replace with some proper parsing logic or plugin metadata file
const pluginIdMatch = pluginTsContents.match(/id: ['"`](.+?)['"`]/);
if (!pluginIdMatch) {
throw new Error(`Failed to parse plugin.ts, no plugin ID found`);
}
const id = pluginIdMatch[1];
return { id, name };
}
async function readTemplateFile(
templateFile: string,
templateVars: any,
@@ -131,13 +100,10 @@ async function diffTemplatedFiles(
}
// Read all template files for a given template, along with all matching files in the target dir
export async function diffTemplateFiles(template: string) {
const pluginInfo = await readPluginInfo();
const templateVars = { version, ...pluginInfo };
export async function diffTemplateFiles(template: string, templateData: any) {
const templateDir = paths.resolveOwn('templates', template);
const templatedFiles = await readTemplate(templateDir, templateVars);
const templatedFiles = await readTemplate(templateDir, templateData);
const fileDiffs = await diffTemplatedFiles(paths.targetDir, templatedFiles);
return fileDiffs;
}