Skip to content

Commit 51480e5

Browse files
committed
Parsers
1 parent c322efd commit 51480e5

File tree

6 files changed

+65
-28
lines changed

6 files changed

+65
-28
lines changed

ResourceParser.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import {OpenAPIV3} from "openapi-types";
2+
import * as lodash from "lodash";
3+
import {toResourceName} from "./src/n8n/utils";
4+
5+
export interface IResourceParser {
6+
name(tag: OpenAPIV3.TagObject): string
7+
8+
value(tag: Pick<OpenAPIV3.TagObject, "name">): string
9+
10+
description(tag: OpenAPIV3.TagObject): string
11+
}
12+
13+
export class DefaultResourceParser {
14+
name(tag: OpenAPIV3.TagObject): string {
15+
return lodash.startCase(tag.name);
16+
}
17+
18+
value(tag: Pick<OpenAPIV3.TagObject, "name">): string {
19+
// TODO: use startCase by default
20+
return toResourceName(tag.name)
21+
// return lodash.startCase(tag.name);
22+
}
23+
24+
description(tag: OpenAPIV3.TagObject): string {
25+
return tag.description || '';
26+
}
27+
}

src/N8NPropertiesBuilder.spec.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -630,10 +630,9 @@ test('test overrides', () => {
630630
];
631631

632632
const parser = new N8NPropertiesBuilder({paths, components}, {
633-
overrides: customDefaults,
634633
OperationsCollector: BaseOperationsCollector
635634
});
636-
const result = parser.build()
635+
const result = parser.build(customDefaults)
637636

638637
expect(result).toEqual([
639638
{

src/N8NPropertiesBuilder.ts

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ import {INodeProperties} from 'n8n-workflow';
22
import {OpenAPIV3} from 'openapi-types';
33
import pino from 'pino';
44
import {OpenAPIWalker} from "./openapi/OpenAPIWalker";
5-
import {ResourcePropertiesCollector as ResourcePropertiesCollectorImpl} from "./ResourcePropertiesCollector";
5+
import {ResourceCollector as ResourcePropertiesCollector} from "./ResourceCollector";
66
import {BaseOperationsCollector, OperationsCollector as OperationsCollectorImpl} from "./OperationsCollector";
77
import * as lodash from "lodash";
8+
import {DefaultOperationParser, IOperationParser} from "./OperationParser";
9+
import {DefaultResourceParser, IResourceParser} from "../ResourceParser";
810

911
export interface Override {
1012
find: any;
@@ -13,42 +15,52 @@ export interface Override {
1315

1416
export interface N8NPropertiesBuilderConfig {
1517
logger?: pino.Logger;
16-
overrides?: Override[];
1718
OperationsCollector?: typeof BaseOperationsCollector,
18-
ResourcePropertiesCollector?: typeof ResourcePropertiesCollectorImpl
19+
ResourcePropertiesCollector?: typeof ResourcePropertiesCollector
20+
operation?: IOperationParser,
21+
resource?: IResourceParser,
1922
}
2023

2124
export class N8NPropertiesBuilder {
2225
private readonly doc: OpenAPIV3.Document;
2326
private readonly logger: pino.Logger
2427
private readonly walker: OpenAPIWalker;
25-
private readonly overrides: Override[]
2628

2729
// DI
30+
private readonly operationParser: IOperationParser;
31+
private readonly resourceParser: IResourceParser;
2832
private readonly OperationsCollector: typeof BaseOperationsCollector;
29-
private readonly ResourcePropertiesCollector: typeof ResourcePropertiesCollectorImpl;
33+
private readonly ResourcePropertiesCollector: typeof ResourcePropertiesCollector;
3034

3135
constructor(doc: any, config?: N8NPropertiesBuilderConfig) {
3236
this.doc = doc
3337
this.logger = config?.logger || pino({transport: {target: 'pino-pretty'}})
3438
this.walker = new OpenAPIWalker(this.doc)
39+
40+
// DI
41+
this.operationParser = config?.operation || new DefaultOperationParser()
42+
this.resourceParser = config?.resource || new DefaultResourceParser()
3543
this.OperationsCollector = config?.OperationsCollector ? config.OperationsCollector : OperationsCollectorImpl
36-
this.ResourcePropertiesCollector = config?.ResourcePropertiesCollector ? config.ResourcePropertiesCollector : ResourcePropertiesCollectorImpl
37-
this.overrides = config?.overrides || []
44+
this.ResourcePropertiesCollector = config?.ResourcePropertiesCollector ? config.ResourcePropertiesCollector : ResourcePropertiesCollector
3845
}
3946

40-
build(): INodeProperties[] {
41-
const resourcePropertiesCollector = new this.ResourcePropertiesCollector()
47+
build(overrides: Override[] = []): INodeProperties[] {
48+
const resourcePropertiesCollector = new this.ResourcePropertiesCollector(this.resourceParser)
4249
this.walker.walk(resourcePropertiesCollector)
43-
const resourceNode = resourcePropertiesCollector.iNodeProperty
50+
const resourceNode = resourcePropertiesCollector.resources
4451

45-
const operationsCollector = new this.OperationsCollector(this.logger, this.doc)
52+
const operationsCollector = new this.OperationsCollector(
53+
this.doc,
54+
this.operationParser,
55+
this.resourceParser,
56+
this.logger,
57+
)
4658
this.walker.walk(operationsCollector)
4759
const operations = operationsCollector.operations
4860
const fields = operationsCollector.fields
4961

5062
const properties = [resourceNode, ...operations, ...fields]
51-
return this.update(properties, this.overrides)
63+
return this.update(properties, overrides)
5264
}
5365

5466
private update(fields: any[], patterns: Override[]) {

src/OperationParser.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,4 @@ export class DefaultOperationParser implements IOperationParser {
3232
description(operation: OpenAPIV3.OperationObject, context: OperationContext): string {
3333
return operation.description || operation.summary || '';
3434
}
35-
3635
}

src/OperationsCollector.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,26 @@ import * as lodash from "lodash";
33
import pino from "pino";
44
import {OpenAPIV3} from "openapi-types";
55
import {N8NINodeProperties} from "./SchemaToINodeProperties";
6-
import {DefaultOperationParser, IOperationParser} from "./OperationParser";
6+
import {IOperationParser} from "./OperationParser";
77
import {OptionsByResourceMap} from "./n8n/OptionsByResourceMap";
88
import {INodeProperties} from "n8n-workflow";
99
import {replacePathVarsToParameter} from "./n8n/utils";
10-
import {DefaultResourceParser, IResourceParser} from "../ResourceParser";
10+
import {IResourceParser} from "../ResourceParser";
1111

1212
export class BaseOperationsCollector implements OpenAPIVisitor {
1313
public readonly _fields: INodeProperties[]
1414
private optionsByResource: OptionsByResourceMap = new OptionsByResourceMap()
15-
private readonly logger: pino.Logger;
1615
private n8nNodeProperties: N8NINodeProperties;
1716

18-
// Dependency injection light version
19-
protected operationParser: IOperationParser = new DefaultOperationParser()
20-
protected resourceParser: IResourceParser = new DefaultResourceParser()
17+
// Log context
2118
private bindings: any
2219

23-
constructor(logger: pino.Logger, doc: any) {
24-
this.logger = logger.child({})
20+
constructor(
21+
doc: any,
22+
protected operationParser: IOperationParser,
23+
protected resourceParser: IResourceParser,
24+
protected logger: pino.Logger
25+
) {
2526
this._fields = []
2627
this.n8nNodeProperties = new N8NINodeProperties(doc)
2728
}
Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {OpenAPIVisitor, OperationContext} from "./openapi/OpenAPIVisitor";
22
import {OpenAPIV3} from "openapi-types";
33
import {INodeProperties} from "n8n-workflow";
4-
import {DefaultResourceParser, IResourceParser} from "../ResourceParser";
4+
import {IResourceParser} from "../ResourceParser";
55

66
interface TagObject {
77
name: string;
@@ -12,16 +12,15 @@ interface TagObject {
1212
* Collects resource properties from OpenAPI document
1313
* Resource is basically tags from OpenAPI spec
1414
*/
15-
export class ResourcePropertiesCollector implements OpenAPIVisitor {
15+
export class ResourceCollector implements OpenAPIVisitor {
1616
private tags: Map<string, TagObject>;
1717
private tagsOrder = new Map<string, number>();
18-
protected resourceParser: IResourceParser = new DefaultResourceParser()
1918

20-
constructor() {
19+
constructor(protected resourceParser: IResourceParser) {
2120
this.tags = new Map<string, TagObject>()
2221
}
2322

24-
get iNodeProperty(): INodeProperties {
23+
get resources(): INodeProperties {
2524
const tags = this.sortedTags
2625
const parser = this.resourceParser
2726
const options = tags.map((tag) => {

0 commit comments

Comments
 (0)