Skip to content

Commit 52bbf7b

Browse files
committed
Add plugin entity + plugin initialization
1 parent 7b90e15 commit 52bbf7b

17 files changed

Lines changed: 325 additions & 37 deletions

File tree

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
import { ConfigCompiler } from '../../config-compiler';
2+
import { PluginsManager } from '../../plugins/manager';
23

34
export const PlanOrchestrator = {
45
async run(rootDirectory: string): Promise<void> {
5-
const loadedProject = await ConfigCompiler.compileProject(rootDirectory);
6+
const project = await ConfigCompiler.parseProject(rootDirectory);
7+
8+
const pluginsManager = new PluginsManager();
9+
await pluginsManager.initializePlugins(project);
10+
611

7-
console.log(JSON.stringify(loadedProject, null, 2));
812
},
913
};
Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { InternalError } from '../utils/errors';
2+
import { ConfigBlockType } from './language-definition';
23
import { ConfigLoader } from './loader';
3-
import { LoadedProject } from './loader/entities/project';
44
import { FileParser } from './parser';
5-
import { ConfigBlockType, ParsedModule, ParsedProject } from './parser/entities';
5+
import { ParsedModule, ParsedProject } from './parser/entities';
6+
import { ProjectConfig } from './parser/entities/project';
67
import { JsonFileParser } from './parser/json/file-parser';
78

89

@@ -12,30 +13,30 @@ export class ConfigCompiler {
1213
'json': new JsonFileParser(),
1314
}
1415

15-
static async compileProject(directory: string): Promise<ParsedProject> {
16-
const loadedProject = await ConfigCompiler.load(directory);
17-
return ConfigCompiler.parse(loadedProject);
18-
}
19-
20-
private static load(directory: string): Promise<LoadedProject> {
21-
return new ConfigLoader().loadProject(directory);
22-
}
16+
static async parseProject(directory: string): Promise<ParsedProject> {
17+
const loadedProject = await (new ConfigLoader().loadProject(directory));
2318

24-
private static async parse(loadedProject: LoadedProject): Promise<ParsedProject> {
25-
const configBlocks = await Promise.all(loadedProject.coreModule.files.map((file) => {
19+
const configBlocksResult = await Promise.all(loadedProject.coreModule.files.map((file) => {
2620
const parser = ConfigCompiler.supportedParsers[file.fileType];
2721
if (!parser) {
2822
throw new InternalError(`Unsupported file format loaded into parser: ${file.fileName}`);
2923
}
3024

3125
return parser.parse(file);
3226
}));
27+
const configBlocks = configBlocksResult.flat(1);
28+
29+
const parsedProjectConfigs = configBlocks.filter((u) => u.configType === ConfigBlockType.PROJECT);
30+
if (parsedProjectConfigs.length !== 1) {
31+
throw new Error('One one project config can be specified');
32+
}
3333

34+
const projectConfig = parsedProjectConfigs[0] as ProjectConfig;
3435
return new ParsedProject({
3536
coreModule: new ParsedModule({
3637
configBlocks: configBlocks.flat(1),
3738
}),
38-
projectConfig: configBlocks.flat(1).find((u) => u.configType === ConfigBlockType.PROJECT)!,
39+
projectConfig,
3940
})
4041
}
4142
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
export enum ConfigBlockType {
2+
PLUGIN = 'plugin',
3+
PROJECT = 'project',
4+
RESOURCE = 'resource',
5+
}
6+
7+
export enum ResourceParameterType {
8+
ARRAY = 'array',
9+
BOOLEAN = 'boolean',
10+
NULL = 'null',
11+
NUMBER = 'number',
12+
OBJECT = 'object',
13+
STRING = 'string',
14+
}

codify-core/src/config-compiler/parser/entities/index.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
11
import { RemoveMethods } from '../../../utils/types';
2+
import { ConfigBlockType } from '../../language-definition';
23
import { ProjectConfig } from './project';
34

4-
export enum ConfigBlockType {
5-
PLUGIN = 'plugin',
6-
PROJECT = 'project',
7-
RESOURCE = 'resource',
8-
}
9-
105
export interface ConfigBlock {
116
configType: ConfigBlockType;
127

codify-core/src/config-compiler/parser/entities/plugin.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { RemoveMethods } from '../../../utils/types'
2-
import { ConfigBlock, ConfigBlockType } from './index';
2+
import { ConfigBlockType } from '../../language-definition';
3+
import { ConfigBlock } from './index';
34

45
export class PluginConfig implements ConfigBlock {
56
configType = ConfigBlockType.PLUGIN;

codify-core/src/config-compiler/parser/entities/project.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import {
99
validateTypeString,
1010
validateUrl
1111
} from '../../../utils/validator';
12-
import { ConfigBlock, ConfigBlockType } from './index';
12+
import { ConfigBlockType } from '../../language-definition';
13+
import { ConfigBlock } from './index';
1314

1415
/** Project JSON supported format
1516
* {

codify-core/src/config-compiler/parser/entities/resource.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { RemoveMethods } from '../../../utils/types';
22
import { validateNameString, validateStringEq, validateTypeRecordStringUnknown, } from '../../../utils/validator';
3-
import { ConfigBlock, ConfigBlockType } from './index';
3+
import { ConfigBlockType } from '../../language-definition';
4+
import { ConfigBlock } from './index';
45

56
/** Resource JSON supported format
67
* {

codify-core/src/config-compiler/parser/json/config-block-factory.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { InvalidResourceError, SyntaxError } from '../../../utils/errors';
2-
import { ConfigBlock, ConfigBlockType } from '../entities';
2+
import { ConfigBlockType } from '../../language-definition';
3+
import { ConfigBlock } from '../entities';
34
import { PluginConfig } from '../entities/plugin';
45
import { ProjectConfig } from '../entities/project';
56
import { ResourceConfig } from '../entities/resource';
Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,64 @@
11
import { RemoveMethods } from '../utils/types';
2-
import { ResourceParameter } from './resource-parameter';
2+
import { validateAllowedObjectKeys, validateNameString, validateTypeRecordStringUnknown, } from '../utils/validator';
3+
import { ResourceParameterDefinition } from './resource-parameter';
4+
5+
type Name = string;
6+
7+
/**
8+
* Example json def:
9+
* {
10+
* "name": "plugin_name_resource_one"
11+
* "parameters: {
12+
* "parameter1": {
13+
* "type": "number",
14+
* "minNumberValue": 0,
15+
* }
16+
* "parameter2": "string",
17+
* }
18+
* }
19+
*/
320

421
export class ResourceDefinition {
5-
typeId!: string;
6-
parameters!: ResourceParameter[];
22+
name!: string;
23+
parameters!: Map<Name, ResourceParameterDefinition>;
724

825
constructor(props: RemoveMethods<ResourceDefinition>) {
926
Object.assign(this, props);
1027
}
1128

29+
static fromJson(json: unknown): ResourceDefinition {
30+
if (this.validateDefinition(json)) {
31+
const entries = Object.entries(json.parameters).map(([name, value]) => {
32+
const resourceParameterDefinition = ResourceParameterDefinition.fromJson(name, value);
33+
34+
return [name, resourceParameterDefinition] as const;
35+
})
36+
37+
const parametersMap = new Map(entries);
38+
return new ResourceDefinition({ name: json.name, parameters: parametersMap })
39+
}
40+
41+
throw new Error('Unable to parse resource definition');
42+
}
43+
44+
private static validateDefinition(json: unknown): json is { name: string; parameters: Record<string, unknown> } {
45+
if (!validateTypeRecordStringUnknown(json)) {
46+
return false;
47+
}
48+
49+
if (!validateAllowedObjectKeys(json, ['name', 'parameters'])) {
50+
return false;
51+
}
52+
53+
if (!validateNameString(json.name)) {
54+
return false;
55+
}
56+
57+
if (!validateTypeRecordStringUnknown(json.parameters)) {
58+
return false;
59+
}
60+
61+
return true;
62+
}
63+
1264
}

codify-core/src/entities/resource-node.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { RemoveMethods } from '../utils/types';
22
import { Node } from './node';
3-
import { ResourceParameter } from './resource-parameter';
3+
import { ResourceParameterDefinition } from './resource-parameter';
44

55
export class ResourceNode implements Node {
66
type!: string;
77
name!: string;
88
metadata?: Record<string, unknown>;
9-
parameters!: ResourceParameter[];
9+
parameters!: ResourceParameterDefinition[];
1010
dependencies!: Node[];
1111

1212
constructor(props: RemoveMethods<ResourceNode>) {

0 commit comments

Comments
 (0)