nx/scripts/documentation/package-schemas/generatePackageSchemas.ts
2022-07-13 13:01:02 -04:00

91 lines
3.0 KiB
TypeScript

/*
* Lookup for all the schema.json and add create a list with their path and related package information
* */
import * as chalk from 'chalk';
import { readJsonSync, writeJSONSync } from 'fs-extra';
import { join, resolve } from 'path';
import {
getSchemaFromReference,
InternalLookup,
} from '../../../nx-dev/data-access-packages/src/lib/lookup';
import { NxSchema } from '../../../nx-dev/models-package/src/lib/package.models';
import { generateJsonFile } from '../utils';
import { getPackageMetadataList } from './package-metadata';
import { schemaResolver } from './schema.resolver';
function processSchemaData(data: NxSchema, path: string): NxSchema {
const lookup = new InternalLookup(data);
const schema = getSchemaFromReference('#', lookup) as NxSchema;
if (schema === undefined)
throw new Error('ERROR: Could not look up the schema at: ' + data.title);
if (typeof schema === 'boolean')
throw new Error('ERROR: Boolean schema not supported.');
const resolver = schemaResolver(schema, lookup, path);
resolver.resolveReferences();
resolver.resolveExamplesFile();
return resolver.getSchema();
}
function pathResolver(root: string): (path: string) => string {
return (path) => join(root, path.replace('schema.json', ''));
}
export function generatePackageSchemas(): Promise<void>[] {
console.log(`${chalk.blue('i')} Generating Package Schemas`);
const absoluteRoot = resolve(join(__dirname, '../../../'));
const packages = getPackageMetadataList(absoluteRoot, 'packages', 'docs').map(
(packageMetadata) => {
const getCurrentSchemaPath = pathResolver(absoluteRoot);
if (!!packageMetadata.executors.length) {
packageMetadata.executors = packageMetadata.executors.map((item) => ({
...item,
schema: processSchemaData(
item.schema,
getCurrentSchemaPath(item['path'].replace('schema.json', ''))
),
}));
}
if (!!packageMetadata.generators.length) {
packageMetadata.generators = packageMetadata.generators.map((item) => ({
...item,
schema: processSchemaData(
item.schema,
getCurrentSchemaPath(item['path'].replace('schema.json', ''))
),
}));
}
return packageMetadata;
}
);
const outputPath: string = join(absoluteRoot, 'docs');
/*
* Creates packages.json file containing the list of the packages created with their path.
*/
const packageList = packages.map((p) => ({
name: p.name,
path: join('generated', 'packages', p.name + '.json'),
schemas: {
executors: p.executors.map((s) => s.name),
generators: p.generators.map((s) => s.name),
},
}));
generateJsonFile(join(outputPath, 'packages.json'), packageList);
/**
* Generates each package metadata in an `/packages` sub-folder.
*/
return packages.map(
(p): Promise<void> =>
generateJsonFile(
join(outputPath, 'generated', 'packages', p.name + '.json'),
p
)
);
}