diff options
| author | ST-DDT <[email protected]> | 2023-02-01 22:33:15 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-02-01 22:33:15 +0100 |
| commit | 9c3618d66550b7a72cade402b035ecdbcb485625 (patch) | |
| tree | 0f6792026c965c745f6763b9ba1b14a3d26f828e /scripts/apidoc/diff.ts | |
| parent | de7ed2e3b823131345995da6ec52c2b0c40c8d6e (diff) | |
| download | faker-9c3618d66550b7a72cade402b035ecdbcb485625.tar.xz faker-9c3618d66550b7a72cade402b035ecdbcb485625.zip | |
infra(docs): add docs diff script (#1755)
Diffstat (limited to 'scripts/apidoc/diff.ts')
| -rw-r--r-- | scripts/apidoc/diff.ts | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/scripts/apidoc/diff.ts b/scripts/apidoc/diff.ts new file mode 100644 index 00000000..913062c8 --- /dev/null +++ b/scripts/apidoc/diff.ts @@ -0,0 +1,98 @@ +import type { DocsApiDiffIndex } from './utils'; +import { nameDocsDiffIndexFile, pathDocsDiffIndexFile } from './utils'; + +/** + * Loads the diff index from the given source url. + * + * @param url The url to load the diff index from. + */ +async function loadRemote(url: string): Promise<DocsApiDiffIndex> { + return fetch(url).then((res) => { + if (!res.ok) { + throw new Error( + `Failed to load remote diff index from ${url}: ${res.statusText}` + ); + } else { + return res.json() as Promise<DocsApiDiffIndex>; + } + }); +} + +/** + * Loads the diff index from the given local path. + * + * @param path The path to load the diff index from. Should start with `file://` for cross platform compatibility. + */ +async function loadLocal(path: string): Promise<DocsApiDiffIndex> { + return import(path).then((imp) => imp.default as DocsApiDiffIndex); +} + +/** + * Loads the diff index from the given source. + * If the source starts with `https://` it will be loaded from the remote url. + * Otherwise it will be loaded from the local path. + * + * @param source The source to load the diff index from. + */ +async function load(source: string): Promise<DocsApiDiffIndex> { + if (source.startsWith('https://')) { + return loadRemote(source); + } else { + return loadLocal(source); + } +} + +/** + * Returns a set of all keys from the given entries. + * + * @param entries The entries to get the keys from. + */ +function allKeys( + ...entries: ReadonlyArray<Record<string, unknown>> +): Set<string> { + return new Set(entries.map(Object.keys).flat()); +} + +/** + * Compares the target (reference) and source (changed) diff index and returns the differences. + * The returned object contains the module names as keys and the method names as values. + * If the module name is `ADDED` or `REMOVED` it means that the module was added or removed in the local diff index. + * + * @param targetDiffIndex The url to the target (reference) diff index. Defaults to the next.fakerjs.dev diff index. + * @param sourceDiffIndex The path to the source (changed) index. Defaults to the local diff index. + */ +export async function diff( + targetDiffIndex = `https://next.fakerjs.dev/${nameDocsDiffIndexFile}`, + sourceDiffIndex = `file://${pathDocsDiffIndexFile}` +): Promise<Record<string, ['ADDED'] | ['REMOVED'] | string[]>> { + const target = await load(targetDiffIndex); + const source = await load(sourceDiffIndex); + + const diff: Record<string, string[]> = {}; + + for (const moduleName of allKeys(target, source)) { + const remoteModule = target[moduleName]; + const localModule = source[moduleName]; + + if (!remoteModule) { + diff[moduleName] = ['ADDED']; + continue; + } + + if (!localModule) { + diff[moduleName] = ['REMOVED']; + continue; + } + + for (const methodName of allKeys(remoteModule, localModule)) { + const remoteMethod = remoteModule[methodName]; + const localMethod = localModule[methodName]; + + if (remoteMethod !== localMethod) { + (diff[moduleName] ??= []).push(methodName); + } + } + } + + return diff; +} |
