Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion deno.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@denosaurs/typefetch",
"version": "0.0.32",
"version": "0.0.33",
"exports": {
".": "./main.ts"
},
Expand Down
28 changes: 18 additions & 10 deletions main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,15 @@ const parseOptions = {
"config",
"import",
"base-urls",
"experimental-discriminator",
],
boolean: [
"help",
"include-absolute-url",
"include-server-urls",
"include-relative-url",
"experimental-urlsearchparams",
"experimental-require-discriminator",
],
alias: { "output": "o", "help": "h", "version": "V" },
default: {
Expand All @@ -35,6 +37,8 @@ const parseOptions = {
"include-absolute-url": false,
"include-relative-url": false,
"experimental-urlsearchparams": false,
"experimental-discriminator": false,
"experimental-require-discriminator": false,
},
unknown: (arg: string, key?: string) => {
if (key === undefined) return;
Expand All @@ -54,16 +58,18 @@ if (args.help) {
console.log(
`Usage: typefetch [OPTIONS] <PATH>\n\n` +
`Options:\n` +
` -h, --help Print this help message\n` +
` -V, --version Print the version of TypeFetch\n` +
` -o, --output <PATH> Output file path (default: ${parseOptions.default["output"]})\n` +
` --config <PATH> File path to the tsconfig.json file\n` +
` --import <PATH> Import path for TypeFetch (default: ${parseOptions.default["import"]})\n` +
` --base-urls <URLS> A comma separated list of custom base urls for paths to start with\n` +
` --include-server-urls Include server URLs from the schema in the generated paths (default: ${parseOptions.default["include-server-urls"]})\n` +
` --include-absolute-url Include absolute URLs in the generated paths (default: ${parseOptions.default["include-absolute-url"]})\n` +
` --include-relative-url Include relative URLs in the generated paths (default: ${parseOptions.default["include-relative-url"]})\n` +
` --experimental-urlsearchparams Enable the experimental fully typed URLSearchParamsString type (default: ${parseOptions.default["experimental-urlsearchparams"]})\n`,
` -h, --help Print this help message\n` +
` -V, --version Print the version of TypeFetch\n` +
` -o, --output <PATH> Output file path (default: ${parseOptions.default["output"]})\n` +
` --config <PATH> File path to the tsconfig.json file\n` +
` --import <PATH> Import path for TypeFetch (default: ${parseOptions.default["import"]})\n` +
` --base-urls <URLS> A comma separated list of custom base urls for paths to start with\n` +
` --include-server-urls Include server URLs from the schema in the generated paths (default: ${parseOptions.default["include-server-urls"]})\n` +
` --include-absolute-url Include absolute URLs in the generated paths (default: ${parseOptions.default["include-absolute-url"]})\n` +
` --include-relative-url Include relative URLs in the generated paths (default: ${parseOptions.default["include-relative-url"]})\n` +
` --experimental-urlsearchparams Enable the experimental fully typed URLSearchParamsString type (default: ${parseOptions.default["experimental-urlsearchparams"]})\n` +
` --experimental-discriminator Allows you to specify a discriminator generic argument to fetch (default: ${parseOptions.default["experimental-discriminator"]})\n` +
` --experimental-require-discriminator Makes the use of a discriminator generic argument required (default: ${parseOptions.default["experimental-require-discriminator"]})\n`,
);
Deno.exit(0);
}
Expand Down Expand Up @@ -111,6 +117,8 @@ const options = {
includeServerUrls: args["include-server-urls"],
includeRelativeUrl: args["include-relative-url"],
experimentalURLSearchParams: args["experimental-urlsearchparams"],
discriminator: args["experimental-discriminator"],
requireDiscriminator: args["experimental-require-discriminator"],
};

const project = new Project({ tsConfigFilePath: args.config });
Expand Down
17 changes: 17 additions & 0 deletions mod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ import type {
CodeBlockWriter,
JSDocStructure,
ModuleDeclaration,
OptionalKind,
SourceFile,
TypeParameterDeclarationStructure,
} from "ts-morph";
import { STATUS_CODE } from "@std/http/status";

Expand Down Expand Up @@ -34,6 +36,8 @@ export interface Options {
includeRelativeUrl?: boolean;
includeServerUrls?: boolean;
experimentalURLSearchParams?: boolean;
experimentalDiscriminator?: string | false;
experimentalRequireDiscriminator?: boolean;
}

export function escapeObjectKey(key: string): string {
Expand Down Expand Up @@ -677,10 +681,23 @@ export function addOperationObject(

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

const typeParameters: OptionalKind<TypeParameterDeclarationStructure>[] = [];
if (options.experimentalDiscriminator) {
const discriminatorType = `"${options.experimentalDiscriminator}"`;
typeParameters.push({
name: "T",
constraint: discriminatorType,
default: options.experimentalRequireDiscriminator
? undefined
: discriminatorType,
});
}

global.addFunctions(
requestBodyTypes.map(({ contentType, requestBodyType }) => ({
name: "fetch",
docs: notEmpty(doc) ? [doc] : [],
typeParameters: typeParameters,
parameters: [
{
name: "input",
Expand Down