Skip to content

Commit 19bdd74

Browse files
feat: Experimental --discriminator and --require-discriminator (#21)
1 parent 3e913ac commit 19bdd74

3 files changed

Lines changed: 36 additions & 11 deletions

File tree

deno.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@denosaurs/typefetch",
3-
"version": "0.0.32",
3+
"version": "0.0.33",
44
"exports": {
55
".": "./main.ts"
66
},

main.ts

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@ const parseOptions = {
1717
"config",
1818
"import",
1919
"base-urls",
20+
"experimental-discriminator",
2021
],
2122
boolean: [
2223
"help",
2324
"include-absolute-url",
2425
"include-server-urls",
2526
"include-relative-url",
2627
"experimental-urlsearchparams",
28+
"experimental-require-discriminator",
2729
],
2830
alias: { "output": "o", "help": "h", "version": "V" },
2931
default: {
@@ -35,6 +37,8 @@ const parseOptions = {
3537
"include-absolute-url": false,
3638
"include-relative-url": false,
3739
"experimental-urlsearchparams": false,
40+
"experimental-discriminator": false,
41+
"experimental-require-discriminator": false,
3842
},
3943
unknown: (arg: string, key?: string) => {
4044
if (key === undefined) return;
@@ -54,16 +58,18 @@ if (args.help) {
5458
console.log(
5559
`Usage: typefetch [OPTIONS] <PATH>\n\n` +
5660
`Options:\n` +
57-
` -h, --help Print this help message\n` +
58-
` -V, --version Print the version of TypeFetch\n` +
59-
` -o, --output <PATH> Output file path (default: ${parseOptions.default["output"]})\n` +
60-
` --config <PATH> File path to the tsconfig.json file\n` +
61-
` --import <PATH> Import path for TypeFetch (default: ${parseOptions.default["import"]})\n` +
62-
` --base-urls <URLS> A comma separated list of custom base urls for paths to start with\n` +
63-
` --include-server-urls Include server URLs from the schema in the generated paths (default: ${parseOptions.default["include-server-urls"]})\n` +
64-
` --include-absolute-url Include absolute URLs in the generated paths (default: ${parseOptions.default["include-absolute-url"]})\n` +
65-
` --include-relative-url Include relative URLs in the generated paths (default: ${parseOptions.default["include-relative-url"]})\n` +
66-
` --experimental-urlsearchparams Enable the experimental fully typed URLSearchParamsString type (default: ${parseOptions.default["experimental-urlsearchparams"]})\n`,
61+
` -h, --help Print this help message\n` +
62+
` -V, --version Print the version of TypeFetch\n` +
63+
` -o, --output <PATH> Output file path (default: ${parseOptions.default["output"]})\n` +
64+
` --config <PATH> File path to the tsconfig.json file\n` +
65+
` --import <PATH> Import path for TypeFetch (default: ${parseOptions.default["import"]})\n` +
66+
` --base-urls <URLS> A comma separated list of custom base urls for paths to start with\n` +
67+
` --include-server-urls Include server URLs from the schema in the generated paths (default: ${parseOptions.default["include-server-urls"]})\n` +
68+
` --include-absolute-url Include absolute URLs in the generated paths (default: ${parseOptions.default["include-absolute-url"]})\n` +
69+
` --include-relative-url Include relative URLs in the generated paths (default: ${parseOptions.default["include-relative-url"]})\n` +
70+
` --experimental-urlsearchparams Enable the experimental fully typed URLSearchParamsString type (default: ${parseOptions.default["experimental-urlsearchparams"]})\n` +
71+
` --experimental-discriminator Allows you to specify a discriminator generic argument to fetch (default: ${parseOptions.default["experimental-discriminator"]})\n` +
72+
` --experimental-require-discriminator Makes the use of a discriminator generic argument required (default: ${parseOptions.default["experimental-require-discriminator"]})\n`,
6773
);
6874
Deno.exit(0);
6975
}
@@ -111,6 +117,8 @@ const options = {
111117
includeServerUrls: args["include-server-urls"],
112118
includeRelativeUrl: args["include-relative-url"],
113119
experimentalURLSearchParams: args["experimental-urlsearchparams"],
120+
discriminator: args["experimental-discriminator"],
121+
requireDiscriminator: args["experimental-require-discriminator"],
114122
};
115123

116124
const project = new Project({ tsConfigFilePath: args.config });

mod.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ import type {
22
CodeBlockWriter,
33
JSDocStructure,
44
ModuleDeclaration,
5+
OptionalKind,
56
SourceFile,
7+
TypeParameterDeclarationStructure,
68
} from "ts-morph";
79
import { STATUS_CODE } from "@std/http/status";
810

@@ -34,6 +36,8 @@ export interface Options {
3436
includeRelativeUrl?: boolean;
3537
includeServerUrls?: boolean;
3638
experimentalURLSearchParams?: boolean;
39+
experimentalDiscriminator?: string | false;
40+
experimentalRequireDiscriminator?: boolean;
3741
}
3842

3943
export function escapeObjectKey(key: string): string {
@@ -677,10 +681,23 @@ export function addOperationObject(
677681

678682
const input = inputs.map((template) => `\`${template}\``).join("|");
679683

684+
const typeParameters: OptionalKind<TypeParameterDeclarationStructure>[] = [];
685+
if (options.experimentalDiscriminator) {
686+
const discriminatorType = `"${options.experimentalDiscriminator}"`;
687+
typeParameters.push({
688+
name: "T",
689+
constraint: discriminatorType,
690+
default: options.experimentalRequireDiscriminator
691+
? undefined
692+
: discriminatorType,
693+
});
694+
}
695+
680696
global.addFunctions(
681697
requestBodyTypes.map(({ contentType, requestBodyType }) => ({
682698
name: "fetch",
683699
docs: notEmpty(doc) ? [doc] : [],
700+
typeParameters: typeParameters,
684701
parameters: [
685702
{
686703
name: "input",

0 commit comments

Comments
 (0)