92 lines
2.2 KiB
TypeScript
92 lines
2.2 KiB
TypeScript
import { readFileSync } from 'fs';
|
|
import { join } from 'path';
|
|
import {
|
|
getSchemaFromReference,
|
|
Lookup,
|
|
} from '@nrwl/nx-dev/data-access-packages';
|
|
import { NxSchema } from '@nrwl/nx-dev/models-package';
|
|
import { isArray, isObject } from './utils';
|
|
|
|
function traverseAndReplaceReferences(
|
|
item: Record<string, any> | any[] = {},
|
|
keyToMatch = '',
|
|
lookup: Lookup
|
|
) {
|
|
if (isObject(item)) {
|
|
const entries = Object.entries(item);
|
|
|
|
for (let i = 0; i < entries.length; i += 1) {
|
|
const [objectKey, objectValue] = entries[i];
|
|
|
|
if (objectKey === keyToMatch) {
|
|
return { $$$matched: objectValue };
|
|
}
|
|
|
|
if (isObject(objectValue)) {
|
|
const child = traverseAndReplaceReferences(
|
|
objectValue,
|
|
keyToMatch,
|
|
lookup
|
|
);
|
|
|
|
if (
|
|
child &&
|
|
Object.prototype.hasOwnProperty.call(child, '$$$matched')
|
|
) {
|
|
item[objectKey] = getSchemaFromReference(
|
|
child.$$$matched,
|
|
lookup
|
|
) as any;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (isArray(item)) {
|
|
item.forEach((subItem) => {
|
|
if (isObject(subItem) || isArray(subItem))
|
|
traverseAndReplaceReferences(subItem, keyToMatch, lookup);
|
|
});
|
|
}
|
|
}
|
|
|
|
function getExamplesFileFromPath(
|
|
rootPath: string,
|
|
examplesFilePath: string | null
|
|
): string {
|
|
let result: string = '';
|
|
const path: string = join(rootPath, examplesFilePath);
|
|
try {
|
|
result = readFileSync(path, 'utf-8');
|
|
} catch (e) {
|
|
console.log('Could not resolve example for current schema: ', path, e);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
export function schemaResolver(
|
|
schema: NxSchema,
|
|
lookup: Lookup,
|
|
path: string
|
|
): {
|
|
resolveReferences: () => void;
|
|
resolveExamplesFile: () => void;
|
|
getSchema: () => NxSchema;
|
|
} {
|
|
const updatedSchema: NxSchema = structuredClone(schema);
|
|
return {
|
|
resolveReferences: () => {
|
|
traverseAndReplaceReferences(updatedSchema, '$ref', lookup);
|
|
return void 0;
|
|
},
|
|
resolveExamplesFile: () => {
|
|
if (Object.prototype.hasOwnProperty.call(updatedSchema, 'examplesFile'))
|
|
updatedSchema.examplesFile = getExamplesFileFromPath(
|
|
path,
|
|
updatedSchema.examplesFile as string
|
|
);
|
|
return void 0;
|
|
},
|
|
getSchema: () => updatedSchema,
|
|
};
|
|
}
|