Skip to content

Commit

Permalink
feat: Add flag to detect unknown named types (#106)
Browse files Browse the repository at this point in the history
  • Loading branch information
runeh committed Jun 1, 2021
1 parent 00e3c02 commit 85267f0
Show file tree
Hide file tree
Showing 7 changed files with 121 additions and 27 deletions.
29 changes: 22 additions & 7 deletions docs/interfaces/main.generateoptions.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion docs/modules/main.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 12 additions & 12 deletions docs/modules/types.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 22 additions & 3 deletions docs/modules/util.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

43 changes: 41 additions & 2 deletions src/__tests__/util.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import { RootType } from '../main';
import { getCyclicDependencies, getNamedTypes } from '../util';
import { groupFieldKinds } from '../util';
import {
getCyclicDependencies,
getNamedTypes,
getUnknownNamedTypes,
groupFieldKinds,
} from '../util';

describe('groupFieldKinds', () => {
it('smoke test', () => {
Expand Down Expand Up @@ -199,3 +203,38 @@ describe('getNamedTypes', () => {

it.todo('unions, arrays etc');
});

describe('getUknownNamedTypes', () => {
it('finds unknown types', () => {
const roots: RootType[] = [
{ name: 'internal', type: { kind: 'string' } },
{
name: 'foo',
type: {
kind: 'record',
fields: [
{ name: 'first', type: { kind: 'named', name: 'external' } },
{ name: 'second', type: { kind: 'named', name: 'internal' } },
],
},
},
];
expect(getUnknownNamedTypes(roots)).toEqual(['external']);
});

it('empty result when no unknown', () => {
const roots: RootType[] = [
{ name: 'internal', type: { kind: 'string' } },
{
name: 'foo',
type: {
kind: 'record',
fields: [
{ name: 'second', type: { kind: 'named', name: 'internal' } },
],
},
},
];
expect(getUnknownNamedTypes(roots)).toEqual([]);
});
});
13 changes: 11 additions & 2 deletions src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@ import {
UnionType,
rootTypeRt,
} from './types';
import { getCyclicDependencies } from './util';
import { groupFieldKinds } from './util';
import { getCyclicDependencies, groupFieldKinds } from './util';

export type {
PrettierOptions,
Expand Down Expand Up @@ -108,6 +107,15 @@ export interface GenerateOptions {
* Default: false
*/
rejectCyclicDependencies?: boolean;

/**
* Whether to throw when encountering a named type that's not one of the, root
* types. Useful for caching typos when generating code. Must be disabled when
* using named types that are not part of the ones being generated.
*
* Default: false
*/
rejectUnknownNamedTypes?: boolean;
}

const defaultOptions: GenerateOptions = {
Expand All @@ -117,6 +125,7 @@ const defaultOptions: GenerateOptions = {
formatRuntypeName: (e) => e[0].toLowerCase() + e.slice(1),
formatTypeName: (e) => e[0].toUpperCase() + e.slice(1),
rejectCyclicDependencies: false,
rejectUnknownNamedTypes: false,
};

/**
Expand Down
12 changes: 12 additions & 0 deletions src/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,3 +144,15 @@ export function getCyclicDependencies(roots: RootType[]): [string, string][] {

return ret;
}

/**
* public for testing
* @private
* @param roots
* @returns
*/
export function getUnknownNamedTypes(roots: RootType[]): readonly string[] {
const rootNames = roots.map((e) => e.name);
const namedTypes = roots.flatMap((e) => getNamedTypes(e.type));
return namedTypes.filter((e) => !rootNames.includes(e));
}

0 comments on commit 85267f0

Please sign in to comment.