Skip to content

Commit 7db7037

Browse files
committed
chore: add lintEntityFile method
1 parent 7809d1c commit 7db7037

File tree

3 files changed

+75
-7
lines changed

3 files changed

+75
-7
lines changed

packages/core/src/index.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,14 @@ export {
106106
} from './walk.js';
107107
export { getAstNodeByPointer, getLineColLocation, getCodeframe } from './format/codeframes.js';
108108
export { formatProblems, getTotals, type OutputFormat, type Totals } from './format/format.js';
109-
export { lint, lint as validate, lintDocument, lintFromString, lintConfig } from './lint.js';
109+
export {
110+
lint,
111+
lint as validate,
112+
lintDocument,
113+
lintFromString,
114+
lintConfig,
115+
lintEntityFile,
116+
} from './lint.js';
110117
export {
111118
bundle,
112119
bundleDocument,

packages/core/src/lint.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,3 +192,61 @@ export async function lintConfig(opts: {
192192

193193
return ctx.problems;
194194
}
195+
196+
export async function lintEntityFile(opts: {
197+
document: Document;
198+
entityTypes: Record<string, NodeType>;
199+
severity?: ProblemSeverity;
200+
externalRefResolver?: BaseResolver;
201+
}) {
202+
const { document, entityTypes, severity, externalRefResolver = new BaseResolver() } = opts;
203+
204+
const ctx: WalkContext = {
205+
problems: [],
206+
specVersion: 'oas3_0', // Not used for entity validation but required by context
207+
visitorsData: {},
208+
};
209+
210+
const types = normalizeTypes(entityTypes);
211+
212+
const rules: (RuleInstanceConfig & {
213+
visitor: NestedVisitObject<
214+
unknown,
215+
| Oas3Visitor
216+
| Oas3Visitor[]
217+
| Oas2Visitor
218+
| Oas2Visitor[]
219+
| Async2Visitor
220+
| Async2Visitor[]
221+
| Async3Visitor
222+
| Async3Visitor[]
223+
| Arazzo1Visitor
224+
| Arazzo1Visitor[]
225+
| Overlay1Visitor
226+
| Overlay1Visitor[]
227+
>;
228+
})[] = [
229+
{
230+
severity: severity || 'error',
231+
ruleId: 'entity struct',
232+
visitor: Struct({ severity: 'error' }),
233+
},
234+
];
235+
236+
const normalizedVisitors = normalizeVisitors(rules, types);
237+
const resolvedRefMap = await resolveDocument({
238+
rootDocument: document,
239+
rootType: types.EntityFileTypes,
240+
externalRefResolver,
241+
});
242+
243+
walkDocument({
244+
document,
245+
rootType: types.EntityFileTypes,
246+
normalizedVisitors,
247+
resolvedRefMap,
248+
ctx,
249+
});
250+
251+
return ctx.problems;
252+
}

packages/core/src/types/entity-yaml.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,18 @@ import type { JSONSchema } from 'json-schema-to-ts';
55
import type { NodeType } from './index.js';
66

77
export function createEntityTypes(entityFileSchema: JSONSchema) {
8-
const entitySchemaTypes = getNodeTypesFromJSONSchema('entityFileSchema', entityFileSchema);
9-
const entitiesSchemaTypes = getNodeTypesFromJSONSchema('entitiesFilesSchema', {
10-
type: 'array',
11-
items: entityFileSchema,
8+
const entityFileSchemaTypes = getNodeTypesFromJSONSchema('entityFileSchema', {
9+
oneOf: [
10+
entityFileSchema,
11+
{
12+
type: 'array',
13+
items: entityFileSchema,
14+
},
15+
],
1216
});
1317

1418
return {
15-
EntityFileTypes: entitySchemaTypes.entityFileSchema,
16-
EntitiesFileTypes: entitiesSchemaTypes.entitiesFilesSchema,
19+
EntityFileTypes: entityFileSchemaTypes.entityFileSchema,
1720
};
1821
}
1922

0 commit comments

Comments
 (0)